2016-01-11 3 views
12

J'ai quelques URL de service avec la même baseUrl. Pour certains urls, il y aura quelques paramètres communs utilisés, par exemple un apiVersion ou locale. Mais ils n'ont pas besoin d'être dans toutes les URL, donc je ne peux pas les ajouter à la baseUrl.Remplacer les paramètres de chemin communs dans la version 2 avec okhttp

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

Je ne veux pas ajouter ces paramètres dans l'interface de retrofit. En rétrofit 1, j'ai fait un intercepteur et utilisé RequestFacade.addPathParam(..., ...) pour remplir ces paramètres de chemin commun pour chaque URL.

Pour retrofit 2, je n'arrive pas à trouver une façon correcte de le faire avec okhttp. La seule façon dont je vois que cela est possible maintenant est d'obtenir le HttpUrl de Chain.request().httpUrl(); dans un okhttp Interceptor et de manipuler celui-ci moi-même, mais je ne sais pas si c'est la meilleure voie à suivre.

Est-ce que quelqu'un peut trouver un meilleur moyen de remplacer les paramètres de chemin dans un okhttp Interceptor?

Au moment de la rédaction, j'utilise retrofit: 2.0.0-beta2 et okhttp: 2.7.2.

+0

Jetez un oeil à cette réponse http://stackoverflow.com/a/31002094. – mtotschnig

+0

@mtotschnig il n'y a pas de réponse à jour (en utilisant OkHttp 3+ & Retrofit 2+) sur ce fil. – Singed

+0

@Singed la réponse que je lie à travaille pour moi avec Retrofit2 et OkHttp 3 – mtotschnig

Répondre

5

MODIFIABLE 2, je ne peux pas sembler trouver une bonne façon de le faire avec okhttp. La seule façon dont je vois que cela est possible maintenant est d'obtenir le HttpUrl de Chain.request(). HttpUrl(); dans un intercepteur okhttp et manipuler que moi-même, mais je ne sais pas si c'est la meilleure façon d'aller.

Ma mise en œuvre à l'aide 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

Cela m'a aidé. Obtenir les segments de chemin et les boucler est plus sûr, puisque le code ne se cassera pas si le segment de chemin change. – OldSchool4664