iOS/HTTP

HTTP) POST 시 Error

Brad_Heo 2022. 7. 29. 01:59

POST 시 Error

HTTP POST 시 서버 에러 1 - JSON

에러 메시지

"code":400,"message":"JSON parse error: Cannot construct instance of `edu.yagom.dev.ecommerce.rest.product.params.ProductCreationParams` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (154); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `edu.yagom.dev.ecommerce.rest.product.params.ProductCreationParams` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (154)\n at [Source: (PushbackInputStream); line: 1, column: 1]"

문제점

multipart/form-data로 POST 시 위와 같은 에러가 발생 했다..
중요한 에러 메시지는 아무래도 no int/Int-argument constructor/factory method to deserialize from Number value (154)\n at [Source: (PushbackInputStream); line: 1, column: 1]"이 부분인 것 같다.
해석하자면 "넘버 값(154)에 대한 디이니셜라이저 메소드가 없다..? " 라는 얘기 인것같은데 어떻게 해결하면 좋을까 생각해보았다.
일단 "154"라는 데이터를 보내지 않는다.
그래서 multipart/form-data 구조에서 실제 데이터값이 들어가 있는 Body 를 확인해 보았다.

image

위의 빨간 네모칸에 154 bytes가 보인다..?
Body 데이터를 만들어주는 코드를 확인 해보니

image

해당 value 타입 값은 Data 그렇다 보니 Json 형식으로 보내야 하는데 Data형식으로 보내고 있으니 앞서 발생한 에러가 나온 것 같다.

해결방법

JSON형식은 텍스트 형식으로 되어있으니까 해당 value값을 String형식으로 타입캐스팅? 변환을 해주자.. 형태로 String타입으로 만들어 주었다. 먼가 강제로 한느낌이 강해서 추후에 수정필요한대 일단. 사용함.

image

위의 코드처럼

String(data: , encoding: .utf8)

형태로 String타입으로 만들어 주었다.

재 실행 결과...

image

위의 결과처럼 텍스트형식으로 JSON 데이터가 잘 들어간 것을 알 수 있다.

JSON과 multipart/form-data 문서 다시 보자

HTTP POST 시 서버 에러 2 - Image

에러 메시지

"code":400,"message":"Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Header section has more than 10240 bytes (maybe it is not properly terminated)"

문제점

에러 메시지를 보니 Header section has more than 10240 bytes이 부분이 핵심인 것 같다. 해석하자면 "헤더 섹션이 10240바이트를 초과합니다." 라는 내용인대 처음엔 request의 Header 데이터를 너무 많이 넣었나 라고 생각 했지만.. Header에 Content-Type, identifier만 넣어주기 때문에 아닌 것 같고 fileupload의 힌트로 image 데이터가 문제로 보여 진다.

해결방법

다행히?? stack overflow에서 동일한 문제를 겪고 있는 개발자가 있었다..
https://stackoverflow.com/questions/54437636/header-section-has-more-than-10240-bytes-maybe-it-is-not-properly-terminated
위의 내용에서 "I ran into this same issue and it turns out JIRA (or Java) requires \r\n as new line character. After I changed \n to \r\n my requests went through without problem." 간단하게 해석해보니 "\r\n를 한번더 확인해라" 인 것 같다.
혹시나 해서

image

부분 맨 끝에 \r\n을 추가 해주니 정상적으로 POST가 되었다.
아직 정확하게 이해한건 아니지만 구조가 위의 코드대로 되었으면

image

위의 사진처럼 Body의 Header부분과 value부분이 없고 붙어있는 상태이다.

image

다시 수정해서 실행시켜보니

image

Body의 Header부분과 value부분이 분리되어 있는 것을 볼 수 있고 정상적으로 POST가 되었다.

JSON

JSON이란???

위키
-> JSON(제이슨[1], JavaScript Object Notation)은 속성-값 쌍(attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는** 텍스트**를 사용하는 개방형 표준 포맷이다.

하나의 데이터 양식..

HTTP POST

image

빨간색 네모 친 부분은 직접 해주어야 함.!

참고자료

https://ko.wikipedia.org/wiki/JSON
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST

'iOS > HTTP' 카테고리의 다른 글

HTTP) multipart/form-data 에 대해서  (0) 2022.07.27