fastapi 에서 Json과 File 동시에 받기

LST·2023년 7월 29일
0

배경

이번 프로젝트에서 처음 fastapi 를 사용하게 됐는데 아직은 익숙하지 않아 삽질을 좀 하게 됐다. 특히 파일과 json 을 동시에 request를 통해 받는 과정에서 기존에 사용하던 spring boot와는 달라 삽질을 하게 됐다.
일단 결론부터 말하자면 json 과 file 은 동시에 못받는다.
관련 글 : https://stackoverflow.com/questions/65504438/how-to-add-both-file-and-json-body-in-a-fastapi-post-request

springboot

스프링부트에서는 파일과 객체를 동시에 받으려면 이런 식으로 코드를 작성했다.

@postMapping("/")
public Long save(
	@RequestPart MultipartFile file,
    @RequestPart Dto dto) {
}

그리고 post 요청도 form-data 형식으로 dto에 해당하는 application/json을 요청했다. 따라서 지금까지는 별 생각없이 json 파일과 File 을 동시에 보내면 대충 알아서 처리하나보다 라고 생각했다. 실제로 Postman으로 요청할때도 key 값엔 dto아룸 vakue 앤 json형태로 데이터를 입력해서 요청했다.
하지만 fastapi에서 이렇게 요청을 보내면 422 (unsupported ~~) 에러가 떴다. 공식문서에 의하면 이는 fastapi의 한계가 아니라 http 프로토콜 때문이라고 한다. multipart/form-data 형식으로 요청하면 application/json 형태의 body는 multipart/form-data 형식으로 인코딩된다고 한다. 따라서 body에 file과 json을 한번에 요청할 수는 없다고 한다.

해결방법은 스택오버플로우에 잘 나와있다. 참고

나는 body의 모든 값을 model로 요청하지 않고 따로 요청하는 방법을 사용하여 해결했다.

1개의 댓글

comment-user-thumbnail
2023년 7월 29일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기