2017-03-29 6 views
1

Ich versuche Anfragen an eine API zu senden, die Semikolon verwendet (;) statt Ampersand (&) für Abfrageparameter, die URL-Anforderung wie folgt aussieht:Retrofit-Abfragen ohne kaufmännische Und

http://api.example.com/path/?param1=p1;param2=p2 

Die ähnlichste post, die ich im Internet gefunden habe, schlägt vor, eine andere Methode zu verwenden, die url Teile zusammenfügt und dann @Url Annotation verwendet.

Enthält die Nachrüstung eine Lösung für diese Fälle?

Danke.

+0

Huh? Klingt wie Ihre API ist sehr, sehr kaputt. Sind Sie sicher, dass es sich nicht nur um Matrixparameter handelt? – chrylis

+0

@chrylis Ehrlich gesagt habe ich keine Ahnung! –

+1

Es scheint, dass es bereits ein Problem im Zusammenhang mit meinem Problem gibt: https://github.com/square/retrofit/issues/450 –

Antwort

1

Es ist möglich, einen Interceptor zu verwenden, um die URL von '&' in ';' umzuschreiben. Der schwierige Teil besteht darin, die URL so zu ändern, dass sie nicht ungültig wird.

new Interceptor() { 
    Response intercept(Chain chain) throws IOException { 
     HttpUrl originalUrl = chain.request().url(); 
     String query = originalUrl.encodedQuery(); 
     if (query == null) { 
      return chain.proceed(chain.request()); 
     } else { 
      Request.Builder builder = chain.request().newBuilder(); 
      builder.url(originalUrl.newBuilder() 
       .encodedQuery(query.replace('&', ';')) 
       .build()); 
      return chain.proceed(builder.build()); 
     } 
    } 
}; 

Diese OkHttp (die Vernetzung Bibliothek, die Befugnisse Retrofit) Interceptor überprüft, ob die angegebene URL eine Abfrage hat und ersetzt jeden ‚&‘ in der Abfrage Abschnitt mit einem ‚;‘. In der Theorie sollte sich das wie von Ihnen angegeben verhalten.

Es kann angewendet werden, indem Sie die OkHttpClient -Instanz selbst erstellen und die oben genannte Interceptor während des Erstellens installieren.

+0

Danke, es hat funktioniert. –

Verwandte Themen