2017-09-27 3 views
0

Je suis passé à utiliser Retrofit2 et tout est beau et propre ... Mais il y a un appel de service qui nécessite qu'un paramètre de requête soit dans une expression régulière (ne me demandez pas pourquoi, J'ai déjà demandé qu'il soit changé).format paramètre @Query - Retrofit 2

Voici comment ma méthode ressemble à:

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

Si j'appelle searchProducts("lala"), la requête ressemblera: prod/search?q=lala, mais je dois à ressembler prod/search?q=(?i)\\Qlala\\E

est-il un moyen simple formater le paramètre de requête pour le faire? Pensez, vous ne pouvez utiliser qu'une autre méthode.

Répondre

1

Quelque chose comme ceci:

searchProducts(prepareParameter("lala")) 

    fun prepareParameter(query: String) = "(?i)\\\\Q" + query + "\\\\E" 

Vous pouvez également utiliser Interceptor. Mais il serait appel à chaque demande, donc je vous recommande d'utiliser la première variante.

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) 
      } 
     } 

Et dans votre constructeur de rénovation:

val client = new OkHttpClient.Builder() 
       .addInteceptor(yourInterceptor) 
       .build() 
val retrofit = Retrofit.Builder().client(client).build() 
+0

C'est ma solution en ce moment. Je voulais juste savoir s'il y a un moyen que je ne connais pas dans la librairie Retrofit. Je suis nouveau à Retrofit. J'ai utilisé une solution personnalisée pour les appels RSI Api jusqu'à maintenant. – Mugur

+0

@Mugur Update, vous pouvez également utiliser inteceptor. Mais je pense, c'est pire option. –