2017-09-27 56 views
0

我切換到使用Retrofit2,一切都非常乾淨... 但是有一個服務調用需要的查詢參數是一個正則表達式中(不要問我爲什麼,我已經要求改變它)。格式@Query參數 - 改造2

這裏是我的方法是如何的樣子:

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

如果我打電話searchProducts("lala"),查詢將看起來像這樣: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庫中是否有一種方法我不知道。我是新的改造。到目前爲止,一直使用REST API調用的自定義解決方案。 – Mugur

+0

@Mugur更新的答案,你也可以使用inteceptor。但我認爲,這更糟糕的選擇。 –