Wednesday, July 24, 2019

Android Retrofit2에서 application/octet-stream 응답 처리하기

Retrofit2를 이용한 API 정의 및 사용

Retrofit2는 HTTP API를 Java 인터페이스로 변환하는 데 사용하는 타입-안전한 HTTP 클라이언트입니다. API는 별도의 인터페이스로 구성되며, 응답을 받을 형태를 작성하게 됩니다. 예를 들어 다음과 같이 API를 정의할 수 있습니다.

@POST("/norder/api/common/app/version") 
Call<Model> checkUpdate(@Body Dto data);

이렇게 API를 정의하면, 서버 응답 값과 Model의 데이터만 맞추면 response.body가 Model 형식으로 반환됩니다. 이러한 편리성 때문에 많은 개발자들이 Retrofit2를 활용하게 됩니다.

외부 API와 'application/octet-stream' 문제점

그러나 외부 API를 사용하면서 문제 상황이 발생할 수 있습니다. 일반적으로 Model을 따로 정의하지 않아도 Call<JsonObject> 형태로 응답을 받으면 JSON 전체를 가져와 필요한 속성만 사용할 수 있습니다. 그러나 이번에는 'application/octet-stream' 형태로 응답이 반환되는 상황이었습니다.

API 정보를 따로 받지 못하고 URL만 받아온 상황에서 나중에 이 응답이 binary stream이었다는 것을 알았습니다. 이런 상황에서 어떻게 Retrofit2를 활용해 응답을 처리해야 할지 막막했습니다.

'application/octet-stream' 응답 처리 방법

이 문제의 해결 방법은 API 응답을 Call<ResponseBody>로 정의하고 Callback에서 response.body().byteStream()를 호출하면 inputStream을 얻을 수 있습니다. 이 후에는 inputStream을 활용해 필요한 작업을 수행하면 됩니다. 제 경우에는 이 stream을 활용해 임시 파일을 저장하고 소리를 재생하는 작업을 수행했습니다. 해당 방법에 대한 자세한 내용은 다음 글에서 설명할 예정입니다.


0 개의 댓글:

Post a Comment