Android(Java)

안드로이드 Retrofit2 Response 오류 해결 법

E.I.T.U 2022. 5. 3. 17:17
Expected BEGIN_OBJECT but was STRING

업무상 Rest API를 이용해야 하는 일이 생겼는데 Response가 계속 onFailure로 들어가더라

오류를 확인해보니 객체가 아니라 문자열로 떨어진다는데.. 리턴값은 json으로 받는데 이상하다 싶었다

 

잘 보니 [ {....}, {....} ] 인 리스트 형식으로 떨어지고 있어서 생긴 문제였다

 

json object 로 시작하지 않는 경우에는 

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(ScalarsConverterFactory.create())
                .client(client)
                .build();

GsonConverterFactory 대신 ScalarsConverterFactory 로 넣어줘야 한다

 

response 코드도 200으로 잘 떨어지고 이제 해결!!

...이라고 생각했지만 어째서인지 response.body() 를 로그 찍어보니 완전 다 깨져서 나오고 있었다..

 

이번엔 또 뭐가 문제야 ㅠㅠ 하고 봤더니 트래픽 문제를 피하려고 GZIP Compress 된 json이 떨어진다는 것이다

 

이걸 해결못해서 한참 찾다가 결국 Stack Overflow에서 해결법을 찾았다

https://stackoverflow.com/questions/51901333/okhttp-3-how-to-decompress-gzip-deflate-response-manually-using-java-android

 

okhttp 3: how to decompress gzip/deflate response manually using Java/Android

I know that okhttp3 library by default it adds the header Accept-Encoding: gzip and decodes the response automatically for us. The problem I'm dealing with a host that only accepts a header like:

stackoverflow.com

OkHttpClient 를 빌드할 때 Interceptor를 추가하여
response를 gzip decompress 하는 과정을 추가해주면 정상적으로 떨어진다

 

오늘도 하나 더 배워가는 하루였다