2016-01-11 36 views
12

同じbaseUrlを持つサービスURLがあります。いくつかのURLでは、よく使われるパラメータがいくつかあります。たとえば、apiVersionまたはlocaleです。しかし、それらはすべてのURLにある必要はないので、私はそれらをbaseUrlに追加することはできません。レトロフィット2の共通パスパラメータをokhttpに置き換えます。

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

私はこれらのパラメータをレトロフィットインターフェイスに追加したくありません。改造1では、私はインターセプタを作成し、RequestFacade.addPathParam(..., ...)を使用して、これらの共通パスパラメータをすべてのURLに入力しました。

改造2では、okhttpでこれを行う適切な方法が見つからないようです。私がこれを可能にする唯一の方法は、今度はをChain.request().httpUrl();からokhttp Interceptorで取得し、それを自分で操作することですが、これが最善の方法であるかどうかはわかりません。

okhttp Interceptorで誰かがパスパラメータを置き換えるより良い方法を見つけましたか?

私はretrofit:2.0.0-beta2とokhttp:2.7.2を使用しています。

+0

この回答http://stackoverflow.com/a/31002094を見てください。 – mtotschnig

+0

@mtotschnigそのスレッドで(OkHttp 3+&Retrofit 2+を使って)最新の回答はありません。 – Singed

+0

@Singed私はRetrofit2とOkHttp 3で私の仕事にリンクしています。 – mtotschnig

答えて

5

は改造2については、私は okhttpでこれを行うには、適切な方法を見つけるように見えることはできません。これが現在可能であることがわかる唯一の方法は、Chain.request()からHttpUrlを取得することです。httpUrl(); okhttpインターセプタと 自分自身を操作するが、これが最善の方法であるかどうかわからない。 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

これは私を助けました。パスセグメントを取得してループすることは安全です。パスセグメントが変わるとコードが壊れないからです。 – OldSchool4664

関連する問題