2016-04-20 4 views
0

RetrofitとOKHttpを学習しています。問題が発生しました。 私のアプリのすべての要求はちょうどこのように、POSTです:すべてのPOSTで投稿ごとにRetrofitとOKHttpを使用してデフォルトのパラメータを追加する方法

@FormUrlEncoded 
@POST("some url") 
Observable<Result> getData(@Field("id") String id); 

、2つの同じparamsがあります。したがって、最も単純な方法では、@Field( "token")、@ Field( "account")など、すべてのメソッドに@Fieldを2つ追加できます。しかし、私はスマートな方法がなければならないと思う。

次に、私はOkHttpClientがこれを解決できると考えました。

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      RequestBody body = new FormBody.Builder().add("account", "me") 
        .add("token", "123456").build(); 
      request = request.newBuilder().post(body).build(); 
      return chain.proceed(request); 
     } 
    }).build(); 
Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("some base url") 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 

それとも

HttpUrl url = request.url().newBuilder() 
        .setEncodedQueryParameter("account", "me") 
        .setEncodedQueryParameter("token", "123456") 
        .build(); 

ちょうどこの二つにすべてのフィールドを交換する第一の方法。

2番目の方法は、POSTではなく、GETパラメータとしてこれら2つを追加するだけです。

今、私はこの作業をどのようにするかについて全く考えていません。

答えて

1

OK ...最後に、これを行う方法が見つかりました。しかし、私はこれが最善の方法であるとは思わない。ここで

はコードです:

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      FormBody.Builder bodyBuilder = new FormBody.Builder(); 
      FormBody b = (FormBody) request.body(); 
      for (int i=0;i<b.size();i++) { 
       bodyBuilder.addEncoded(b.name(i),b.value(i)); 
      } 
      bodyBuilder.addEncoded("account", "me").add("token", "123456"); 
      request = request.newBuilder().post(bodyBuilder.build()).build(); 
      return chain.proceed(request); 
     } 
    }).build(); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://some url) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 

私は、これらの2つのデフォルトのparamsと同じ新しいRequestBodyにすべてのキーと値ののparamsを追加し、改造からすべて@Fieldを取得します。これですべてのPOST要求に「アカウント」と「トークン」があります。

これを行うより良い方法がある場合は、教えてください。

関連する問題