2016-01-11 7 views
12

Ich habe einige Service-URLs mit der gleichen BaseUrl. Für einige URLs werden einige häufig verwendete Parameter verwendet, z. B. apiVersion oder locale. Aber sie müssen nicht in jeder URL enthalten sein, daher kann ich sie nicht zur baseUrl hinzufügen.Ersetzen Sie allgemeine Pfadparameter in Nachrüstung 2 mit okhttp

.../api/{apiVersion}/{locale}/event/{eventId} 
.../api/{apiVersion}/{locale}/venues 
.../api/{apiVersion}/configuration 

Ich möchte diese Parameter nicht in der Retrofit-Schnittstelle hinzufügen. In Retrofit 1 habe ich einen Interceptor erstellt und RequestFacade.addPathParam(..., ...) verwendet, um diese allgemeinen Pfadparameter für jede URL zu füllen.

Für die Nachrüstung 2, ich kann nicht scheinen, einen richtigen Weg zu finden, dies mit okhttp zu tun. Der einzige Weg, wie ich das jetzt sehen kann, ist, die HttpUrl von Chain.request().httpUrl(); in ein okhttp Interceptor zu bekommen und das selbst zu manipulieren, aber ich weiß nicht, ob das der beste Weg ist.

Hat jemand einen besseren Weg gefunden, Pfadparameter in einem okhttp Interceptor zu ersetzen?

Zum Zeitpunkt des Schreibens verwende ich Retrofit: 2.0.0-Beta2 und okhttp: 2.7.2.

+0

Werfen Sie einen Blick auf diese Antwort http://stackoverflow.com/a/31002094. – mtotschnig

+0

@ Mtotschnig gibt es keine aktuelle Antwort (mit OkHttp 3+ & Retrofit 2+) auf diesen Thread. – Singed

+0

@Singed die Antwort ich verlinke funktioniert für mich mit Retrofit2 und OkHttp 3 – mtotschnig

Antwort

5

Für Retrofit-2 kann ich nicht scheinen, einen richtigen Weg zu finden, diese mit okhttp zu tun. Die einzige Möglichkeit, wie ich das jetzt sehen kann, ist, die HttpUrl von Chain.request() zu bekommen. HttpUrl(); in einem okhttp Interceptor und manipulieren, dass ich selbst, aber ich weiß nicht, ob dies der beste Weg ist zu gehen.

Meine Implementierung mit okhttp: 3,2

class PathParamInterceptor implements Interceptor { 
     private final String mKey; 
     private final String mValue; 

     private PathParamInterceptor(String key, String value) { 
      mKey = String.format("{%s}", key); 
      mValue = value; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request originalRequest = chain.request(); 

      HttpUrl.Builder urlBuilder = originalRequest.url().newBuilder(); 
      List<String> segments = originalRequest.url().pathSegments(); 

      for (int i = 0; i < segments.size(); i++) { 
       if (mKey.equalsIgnoreCase(segments.get(i))) { 
        urlBuilder.setPathSegment(i, mValue); 
       } 
      } 

      Request request = originalRequest.newBuilder() 
        .url(urlBuilder.build()) 
        .build(); 
      return chain.proceed(request); 
     } 
    } 
+0

Das hat mir geholfen. Das Holen der Pfadsegmente und das Durchlaufen von ihnen ist sicherer, da der Code nicht bricht, wenn sich das Pfadsegment jemals ändert. – OldSchool4664