본문 바로가기

Android

[Android] Retrofit 요청 시 url 인코딩 안 되게 하기

반응형

 

문제

retrofit으로 RestAPI 요청 작업 시 url에 서비스키(accessKey)가 들어가야하는 경우가 종종 있는데

이 때, 서비스키에 = 또는 + 와 같이 인코딩 시 문자가 바뀌어 요청이 되어 에러를 발생하게 된다.

reftofit @Query annotation에 다음과 같이 encoded = true 옵션으로 해결이 된다는 내용의 글들이 많이 보인다.

 

@Query(value = "value", encoded = true)

 

하지만 해당 방법으로 요청을 보내도 url은 인코딩되어 전달이 되고, 결과 역시 에러를 발생시킨다.

정확한 원인은 찾아봐도 잘 나오지 않지만 아마 okhttp에 설정을 따로 안 해줘서 그런거같다.

 

해결

해결 방법은 okHttp의 인터셉터에서 url의 인코딩된 부분을 replace 해주는 것이다.

 

internal class MyInterceptor : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val request: Request = chain.request()
        var stringurl = request.url.toString()
        stringurl = stringurl.replace("%3D", "=")
        val newRequest: Request = Request.Builder()
            .url(stringurl)
            .build()
        return chain.proceed(newRequest)
    }
}

 

다음과 같이 %3D의 문자를 = 으로 바꿔 요청을 보내게 된다.

 

okHttpClient = OkHttpClient.Builder()
    .addInterceptor(MyInterceptor())
    .build()

 

그리고 okHttp Builder에 intercaptor를 추가해주면 url을 인코딩 되기전의 상태로 요청을 할 수 있다.

반응형