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ライブラリで私が知らない方法があるかどうかを知りたがっています。私はRetrofitを初めて使っています。今までREST API呼び出し用のカスタムソリューションを使用していました。 – Mugur

+0

@Mugur Update答え、あなたはinteceptorを使うこともできます。しかし、私はそれが悪い選択だと思う。 –