2017-09-27 54 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。但我认为,这更糟糕的选择。 –