문제
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을 인코딩 되기전의 상태로 요청을 할 수 있다.