3월 20, 2022

JSONDecodeError - form data란 ?

 

해당 코드에서 


계속해서 JSONDecodeError가 발생합니다.

포스트맨을 이용해서 계속 값을 보내주는데 


뭐가 문제인지 파악하지 못하고 있습니다.

json.loads()는 json형식을 python의 dictionary 형식으로 변경(decode)해줍니다


그러다 문득 체크박스에서 raw를 선택하고 직접 json을 입력해보았습니다


작성해보면 계속 빨간줄이 뜨는데, json형식에 맞게 인덴트까지 세심히 조절해주면 빨간줄이 더이상뜨지 않습니다

이렇게 post 요청을 보내니 잘 됩니다!


코드의 문제가 아니라, 포스트맨을 통한 요청 방식에 따라 차이가 있는 것이었습니다 


HTTP request body는 bytestring 형식으로 오기때문에 decode를 거쳐 str로 만들어준 이후 각각 방식을 프린트해보겠습니다


이것이 form-data로 보낸것의 결과입니다

이것이 raw로 보낸 것을 프린트 찍어본 결과입니다


그렇다면 포스트맨에서 form-data로 보낼때와 raw로 보낼때의 차이점이 정확히 무엇일까요?


웹사이트 form에서 API로 mulipart/form-data 형식으로 값을 보낼 수 있습니다. 이 형식을 모방한 것이 포스트맨의 form-data 입니다. form-data를 통해 키-값 쌍을 content type을 특정해서 보낼 수 있습니다.
파일을 보낼때에는 form-data를 사용할 수 있습니다. 

body로 data를 보낼때, header에 알맞는 cotent type을 지정하여서 API가 값을 적절하게 받을 수 있게 해줘야 합니다. form-data를 사용하면 이 content-type헤더를 포스트맨이 자동으로 지정합니다.(수동으로 지정해주지 않을 시)

반면에 raw로 body에 값을 실을때에는, postman은 제가 고른 type에 맞게 헤더를 고르게 됩니다.

여기서 고를 수 있습니다.


프론트로부터 post로 요청을 받을때에도, 알맞은 type으로 데이터를 보내주지 않는 한 계속 Key Error가 발생하는 것을 확인할 수 있었습니다. 
분명히 키 값을 다 맞췄음에도 계속 키에러가 나서 보내는 형식을 확인해보니, 파일을 post하는데 일반 application/json 형식으로 보내고 있었기에 키에러가 나는 것을 확인할 수 있었습니다.
 이를 form-data형식으로 변경하니 키에러가 나지 않고 알맞게 데이터를 받을 수 있었습니다.