Search

10. 스프링부트 Controller http body 데이터 전송하기

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() 사용가능.

*참고