@RequestBody로 JSON 변환 실패

트러블슈우우웃팅

목록 보기
3/3

문제상황

  • FastAPI로 보내는 요청이 422 응답이 돌아옴
  • 오류메시지
422 Unprocessable Entity on POST request for "http://127.0.0.1:8000/chat/":
{"detail":[{"type":"model_attributes_type","loc":["body"],"msg":"Input should be a valid dictionary or object to extract fields from","input":"{\"query\":\"??\"}"}]}

원인

JSON 문자열이 문자열 자체로 감싸진 상태가 되어 FastAPI는 이를 객체가 아니라 단순 문자열로 해석했던 것. 따라서 FastAPI에서 기대하는 형식인 JSON 객체와 불일치가 발생해 422 오류가 발생


해결방법

@PostMapping
   public ResponseEntity<String> chat(@RequestBody String userMessage) {

-> String이 아닌 DTO 객체 타입으로

@PostMapping
   public ResponseEntity<String> chat(@RequestBody UserMessageDto userMessage) {

이유

@RequestBody String을 사용하면 요청 본문을 문자열 그대로 받게 된다고 함.

Spring에서는 @RequestBody 어노테이션을 사용하여 요청 본문에서 JSON 데이터를 Java 객체로 자동으로 변환한다고 함. 이 변환은 Jackson 라이브러리를 기반. 하지만, 만약 요청 본문이 JSON이 아닌 단순한 문자열 형태로 전달된다면, Spring은 이를 자바 객체로 자동으로 변환X.

즉, 자동 객체 변환을 원한다면, DTO 객체를 사용해야 함.

또한 내가 파이썬에 객체타입으로 받게 해놨음....

String 형태로 요청을 보내면 FastAPI는 이를 자동으로 Query 객체(사용자지정객체)로 변환할 수 없기 때문에 파싱이 실패!

profile
정리하는게 공부가 될 지 모르겠지만, 정리를 하면 마음만큼은 편해

0개의 댓글