http body 데이터 전송하기(실습)
http header의 Content-Type 이해
쌀 포대기를 가지고 와서 두고가면 창고지기 입장에서는 저게 뭔지 풀어서 일일히 확인해야하는 번거로움이 생긴다.
내가 body 데이터를 전송할때 content-type을 명시를 해서 전달을 해야 받는 쪽에서 일을 수월하게 할 수 있다.
그래서 content-type이 http header에 프로토콜로 존재한다. 무조건 있어야한다.
Post , Put 요청할때만 !
(Delete 랑 Get 요청은 body 데이터가 없으니까 content-type도 필요가 없다)
스프링부트는 기본적으로 x-www-form-urlencoded 타입을 파싱(분석)해준다.
x-www-form-urlencoded
ex) key = value 형태
text/plain
ex) 안녕
application/json
ex) { “username” : “cos”}
실습
생성
package com.cos.controllerdemo.web;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HttpBOdyController {
@PostMapping("/body1")
public String xwwwformurlencoded() {
return "key=value 전송 옴 ";
}
@PostMapping("/body2")
public String plaintext() {
return "plain/text 전송 옴 ";
}
@PostMapping("/body3")
public String applicationjson() {
return "json 전송 옴 ";
}
}
Java
복사
서버 켜주고
포스트맨에서
body1
send 누르면 요청은 갔는데 데이터를 담아서 갔다는게 잘 안보인다
Header로 가서 hidden 버튼 클릭 후
content-type에 담아서 갔다는게 보여진다. (body에 담기전에는 content-type이 보이지 않음)
@PostMapping("/body1")
public String xwwwformurlencode(String username) {
return "key=value 전송 옴 ";
}
Java
복사
username 추가해주고 log도 찍어보자
logger만 쳐주고 자동완성의 첫번째꺼 클릭.
package com.cos.controllerdemo.web;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HttpBOdyController {
//log용
private static final Logger log = LoggerFactory.getLogger(HttpBOdyController.class);
@PostMapping("/body1")
public String xwwwformurlencode(String username) {
log.info(username);
return "key=value 전송 옴 ";
}
@PostMapping("/body2")
public String plaintext() {
return "plain/text 전송 옴 ";
}
@PostMapping("/body3")
public String applicationjson() {
return "json 전송 옴 ";
}
}
Java
복사
저장 후 포스트맨으로 send 하고
console 창에
맨밑에 로그가 찍혀있다.
body2
잠만!!!!
@PostMapping("/body2")
public String plaintext(String data) {
log.info(data);
return "plain/text 전송 옴 ";
}
Java
복사
이렇게 받게 되면 기본적인 x-www-form-urlencoded 형식으로 받게된다.
postman에서 header의 content-type에서 우린 지금 text/plain 형태기 때문에
@RequestBody 으로 받아주자.
@PostMapping("/body2")
public String plaintext(@RequestBody String data) { //평문 : 안녕
log.info(data);
return "plain/text 전송 옴 ";
}
Java
복사
body3
json이 뭔지 모르겠다 싶으면
이 영상 추천
@PostMapping("/body3")
public String applicationjson(@RequestBody String data) {
log.info(data);
return "json 전송 옴 ";
}
Java
복사
데이터를 잘 갖고오지만 내가 cos값만 갖고오고 싶을때는 어떻게 해야할까!
domain 패키지 안에 User 라는 클래스 생성
package com.cos.controllerdemo.domain;
public class User {
private String username;
}
Java
복사
package com.cos.controllerdemo.domain;
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Java
복사
username이라는 key값 getter , setter가 만들어졌다.
HttpBOdyController.java로 돌아가서
@PostMapping("/body4")
public String applicationjsonToObject(@RequestBody User user) {
log.info(user.getUsername());
return "json 전송 옴 ";
}
Java
복사
포스트맨 날려주면
자바 오브젝트로 바로 받아준다.
json 데이터를 자바 오브젝트로 받아야 user.getUsername() 사용가능.