2016-01-11 9 views
12

Mam kilka adresów URL usług z tym samym baseUrl. W przypadku niektórych adresów URL będzie kilka najczęściej używanych parametrów, na przykład apiVersion lub locale. Ale nie muszą być w każdym adresie URL, więc nie mogę dodać ich do baseUrl.Zamień wspólne parametry ścieżki w modernizacji 2 za pomocą okhttp

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

Nie chcę dodawać tych parametrów w interfejsie doposażenia. W retroficie 1 zrobiłem przechwytywacz i użyłem RequestFacade.addPathParam(..., ...), aby wypełnić te wspólne parametry ścieżki dla każdego adresu URL.

Dla retrofitu 2, nie mogę znaleźć właściwego sposobu zrobienia tego z okhttp. Jedynym sposobem, jaki widzę teraz, jest to, aby uzyskać HttpUrl z Chain.request().httpUrl(); w okhttp Interceptor i manipulować nim samemu, ale nie wiem, czy to jest najlepsza droga.

Czy ktoś ma lepszy sposób na zastąpienie parametrów ścieżki w okhttp Interceptor?

W czasie pisania używam retrofitu: 2.0.0-beta2 i okhttp: 2.7.2.

+0

Zapraszamy do obejrzenia tej odpowiedzi http://stackoverflow.com/a/31002094. – mtotschnig

+0

@mtotschnig nie ma aktualnej odpowiedzi (przy użyciu OkHttp 3+ i Retrofit 2+) w tym wątku. – Singed

+0

@ Sesed the answer I link to działa dla mnie z Retrofit2 i OkHttp 3 – mtotschnig

Odpowiedz

5

Na modernizowanych 2, nie może wydawać się znaleźć właściwą drogę, aby to zrobić z okhttp. Jedynym sposobem, jaki widzę teraz, jest to, aby uzyskać HttpUrl z Chain.request(). HttpUrl(); w okhttp Interceptorze i manipuluję nim sam, ale nie wiem, czy to jest najlepszy sposób, aby przejść.

Moja implementacja przy użyciu 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

To mi pomogło. Uzyskanie segmentów ścieżek i ich przechodzenie przez nie jest bezpieczniejsze, ponieważ kod nie zostanie przerwany, jeśli segment ścieżki kiedykolwiek się zmieni. – OldSchool4664

Powiązane problemy