평소처럼 @Controller 메소드 파라미터로 @RequestBody를 사용했는데 아래와 같은 오류가 났다. 결론은 평소에는 Ajax로 보내는데 HTML 폼 제출 하여서 @RequestBody가 아닌 @RequestPaeram을 사용했어야 한다.
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
application/x-www-form-urlencoded 형식은 HTML 폼 제출에서 주로 사용되며 URL 인코딩 방식으로 인코딩된다.
key=value 쌍을 & 기호로 연결한 쿼리 문자열 형태로 데이터를 전송
클라이언트가 폼 데이터 쿼리 파라미터를 전송하면, @RequestParam은 이를 개별적인 메소드 파라미터로 매핑함
(@RequestParam 은 url 상에서 데이터를 찾는다고 함)
예를 들면 'http://localhost:8080/receive?name=jun&age=13' 이런식
반면에 Json형식으로 데이터를 전달할때는, url은 http://localhost:8080/receive로 변함이 없고 body에 데이터를 포함하여 전송하기 때문에 @RequestParam 으로는 받을 수 없는 것이다.
참조
https://ocblog.tistory.com/49
@RequestBody
단일 HTTP 요청 파라미터를 메소드 파라미터에 넣어주는 annotation
@public String method1(@RequestParam("id") int id, @RequestPaream("name") String name
id 요청 파라미터를 int 타입으로 변환해서 메소드의 id 파라미터에 넣어준다.
메소드 파라미터으 ㅣ이름과 요청 파라미터의 이름이 일치한다면 @RequestParam 이름은 생략 가능하다. 이때는 메소드 파라미터와 이름이 같은 HTTP 요청 파라미터를 전달해준다.
public String method1(@RequestParam int id) {...}
@RequestBody
해당 annotation이 붙은 파라미터에는 HTTP 요청의 본문 부분이 그대로 전달된다.
XML이나 JSON 기반의 메시지를 사용하는 요청의 경우 매우 유용하다. 일반적으로 GET/POSET 요청 파라미터라면 @Requestbody 사용할 일이 없을 것.
html의 form의 기본 Content-Type으로 는 key=value&key=value의 형태로 전달된다는 점
참조
https://jw910911.tistory.com/117
GPT,,
@RequestBody: JSON 형식의 복잡한 데이터 구조를 자바 객체로 변환하여 처리
@RequestParam: 단순한 폼 필드 데이터나 URL 쿼리 파라미터를 개별적으로 처리