Android 格式@查询参数-改装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

我改用了翻新2,一切都很好很干净。。。 但有一个服务调用要求查询参数位于正则表达式中(不要问我为什么,我已经要求对其进行更改)

我的方法是这样的:

@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>>