2017-09-27 5 views
0

Retrofit2로 전환하고 모든 것이 멋지고 깨끗합니다 ... 그러나 쿼리 매개 변수가 정규 표현식 안에 있어야하는 서비스 호출이 있습니다 (이유는 묻지 않습니다. 나는 그것을 바꿀 것을 이미 요구했다.) 내가 searchProducts("lala") 호출하면format @Query parameter - Retrofit 2

@GET("prod/search") 
fun searchProducts(@Query("q") q: String?): Call<Array<Product>> 

이 쿼리는 다음과 같이 표시됩니다 : 여기

처럼 내 방법은 모습입니다 prod/search?q=lala,하지만 난 간단한 방법이 거기에있다 prod/search?q=(?i)\\Qlala\\E

처럼 보이기 위해 필요 그렇게하기 위해 쿼리 매개 변수를 포맷 하시겠습니까?

답변

1

다른 방법을 사용할 수 있습니다. 이 같은 것을 :

searchProducts(prepareParameter("lala")) 

    fun prepareParameter(query: String) = "(?i)\\\\Q" + query + "\\\\E" 

또한 인터셉터를 사용할 수 있습니다. 그러나 모든 요청을 요청할 것이므로 첫 번째 변형을 사용하는 것이 좋습니다.

object : Interceptor { 
      override fun intercept(chain: Interceptor.Chain?): Response { 
       val original = chain!!.request() 
       val originalUrl = original.url() 
       if (originalUrl.encodedPath().contains("prod/search")) { 
        val value = originalUrl.queryParameter("q") 
        val newUrl = originalUrl.newBuilder() 
          .setQueryParameter("q", "(?i)\\\\Q$value\\\\E") 
          .build() 

        val request = original.newBuilder().url(newUrl).build() 
        return chain.proceed(request) 
       } 

       return chain.proceed(original) 
      } 
     } 

그리고 당신의 개조 빌더에서

:

지금 내 솔루션입니다
val client = new OkHttpClient.Builder() 
       .addInteceptor(yourInterceptor) 
       .build() 
val retrofit = Retrofit.Builder().client(client).build() 
+0

. 나는 Retrofit lib에서 모르는 방법이 있는지 알고 싶었습니다. 나는 개조를 처음 받았어. 지금까지 REST API 호출 용 맞춤 솔루션을 사용해 왔습니다. – Mugur

+0

@Mugur 업데이트 대답, 당신은 또한 inteceptor를 사용할 수 있습니다. 그러나 나는 생각한다. 그것은 더 나쁜 선택이다. –