Android 格式@查询参数-改装2
我改用了翻新2,一切都很好很干净。。。 但有一个服务调用要求查询参数位于正则表达式中(不要问我为什么,我已经要求对其进行更改) 我的方法是这样的:Android 格式@查询参数-改装2,android,kotlin,retrofit2,Android,Kotlin,Retrofit2,我改用了翻新2,一切都很好很干净。。。 但有一个服务调用要求查询参数位于正则表达式中(不要问我为什么,我已经要求对其进行更改) 我的方法是这样的: @GET("prod/search") fun searchProducts(@Query("q") q: String?): Call<Array<Product>> @GET(“prod/search”) 趣味搜索产品(@Query(“q”)q:String?):呼叫 如果我调用searchProducts(“lala
@GET("prod/search")
fun searchProducts(@Query("q") q: String?): Call<Array<Product>>
@GET(“prod/search”)
趣味搜索产品(@Query(“q”)q:String?):呼叫
如果我调用searchProducts(“lala”)
,查询将显示为:prod/search?q=lala
,但我需要它显示为prod/search?q=(?I)\\Qlala\\E
有没有一种简单的方法可以格式化查询参数来实现这一点?我想,您只能使用另一种方法。大概是这样的:
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()
您可以使用静态类型作为您的优势。从
@Query
文档中:
使用改装.stringConverter(类型,注释[])
(或对象.toString()
,如果未安装匹配的字符串转换器),将值转换为字符串,然后使用URL编码
您只需创建一个简单的String
包装器,并覆盖toString()
:
然后使用RegularString
作为查询参数:
@GET("prod/search")
fun searchProducts(@Query("q") q: RegularString): Call<Array<Product>>
@GET(“prod/search”)
趣味搜索产品(@Query(“q”)q:RegularString):呼叫
这是我现在的解决方案。我只是想知道在改装库中是否有我不知道的方法。我是新装修的。到目前为止,您一直在为REST Api调用使用自定义解决方案。@Mugur Update answer,您也可以使用inteceptor。但我认为,这是一个更糟糕的选择。
@GET("prod/search")
fun searchProducts(@Query("q") q: RegularString): Call<Array<Product>>