Retrofit

Mutipart 무엇인가? - Multipart는 HTTP에서 여러 종류의 데이터를 동시에 전송하기 위해 사용되는 방식입니다. - 'Content-Type' 헤더에 'multipart/form-data'값을 가지며 여러 개의 part로 구성됩니다. - 주로 파일 업로드나 폼 데이터 전송 등에 사용됩니다. Multipart 활용을 위한 Api 호출 함수 구성 @Multipart @PATCH("/api/v1/users/{id}") suspend fun editUserImage( @HeaderMap headers: HashMap, @Path("id") id: Int, @Part file: MultipartBody.Part ): Response @Multipart 어노테이션과 보낼 파일 데이터에 대해서는 @Pa..
아래와 같이 api 호출 인터페이스를 구성하여 서버와의 통신을 시도했는데, EOFException이 발생했다. interface TestApi { @PUT("/api/test") fun update( @HeaderMap headers: HashMap, @Body request: BodyRequest ): Call } java.io.EOFException: End of input at line 1 column 1 path 통신 후, Response를 반환하는데 Empty Response를 반환하고 있었다. 하지만 내가 작업하면서 NormalResponse Type으로 반환되도록 구성하면서 발생하는 것이 원인이었다. 이 경우 2가지 해결 방법이 존재했다. 1. NormalResponse가 아니라 Unit으로..
(왜 맨날 까먹는지..;;) Retrofit에서 통상 @DELETE 시에는 @Body는 사용하지 않아, 일반적인 @DELETE 처리가 불가능하다... interface DeleteConnectionApi { @HTTP(method = "DELETE", path = "api/mem/externalConnection", hasBody = true) fun deleteConnection( @HeaderMap headers : HashMap, @Body connectionId : DeleteConnectionId ) : Call } 위처럼 @HTTP를 활용하여 hasBody = true 처리 후, 구성해 주면 문제없이 통신이 가능하다.
api 통신에 대한 에러 발생 시, 해당 통신에 대한 Reqeust Body를 추출하여 사용자가 어떠한 값을 보냈는지 파악할 필요가 있다. @Body 또는 @Field 형식으로 보내는 경우에 대해 OkHttpClient에서 값을 추출하는 로직을 구성해 봤다. private fun extractBodyStringFromRequest(request: Request): String { return if (request.body is FormBody) { //Field type val field = mutableMapOf() val formBody = request.body as FormBody for (i in 0 until formBody.size) { field[formBody.name(i)] = form..
네트워크 캐시 역할 : 파일 시스템에 대한 HTTP 및 HTTPS 응답을 캐시하여 재사용할 수 있으므로 시간과 대역폭이 절약됩니다. 하지만, 간혹 서버의 변경 사항을 즉각적으로 반영해야할 때, 오히려 걸림돌이 되는 경우가 있다. builder.addInterceptor(Interceptor { val request = it.request().newBuilder().cacheControl(CacheControl.Builder().noCache().build()) Request 빌더에 캐시 기능 없음을 명시하거나 interface TestApi { @Headers("Cache-Control: no-cache") @GET("test/test.json") fun checkTest(): Call } 인터페이스에 ..
Moshi - API 통신 시, JSON과 객체 사이의 직렬화 및 역직렬화를 간단하고 신속하게 해주는 라이브러리 - 내부 동작에서 Reflection 사용 Reflection : 자바의 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근 가능케 하는 API을 일컫는다. 직렬화 : 특정 데이터를 다른 CPU로 보내기 전 통신이 가능하면서도 나중에 재구성이 가능한 포맷으로 환해주는 행위 역직렬화 : 직렬화된 데이터를 다시 객체 형태로 변환하는 행위 JSON 처리 @JsonClass Annotation : JSON Object에 대응되는 역할을 한다. 해당 Annotation은 JSON Object에 대응되는 클래스 생성 시 상단에 붙인다. 파라미터로 들어가는 generateAdapter를 true로 S..
서버와의 협업 중, 어떤 사유로 반환 값이 empty body가 수신될 때, 제목과 같은 Exception이 발생했다. 명시한 data class와 별개로 해당 상황에 대한 response body convert 처리가 필요한 것으로 파악된다. 따라서 다음과 같이 Custom Converter Factory를 생성하여 Retrofit Builder에 반영해주어야한다. class EmptyResponseConverterFactory : Converter.Factory() { override fun responseBodyConverter( type: Type, annotations: Array, retrofit: Retrofit ): Converter { val delegate = retrofit.nextR..
SeungYong.Lee
'Retrofit' 태그의 글 목록