2016-04-20 1 views
0

Я просто изучаю Модернизацию и OKHttp, теперь у меня есть проблема. Каждый запрос в моем приложении является POST, так же, как это:Как добавить параметры по умолчанию с помощью Retrofit и OKHttp в каждом сообщении

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

В каждом посте, есть два одинаковые PARAMS. Таким образом, самым простым способом я могу добавить еще два @Field в каждом методе, например, @Field («токен»), @ Field («account»). Но я думаю, что должен быть умный способ.

Тогда я подумал, что 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(); 

Первый метод просто заменить все поля в этих двух.

Второй способ просто добавить эти два параметра GET, а не POST.

Теперь у меня нет абсолютно никакой идеи, как сделать эту работу.

ответ

1

ОК ... Наконец, я нахожу способ сделать это. Но я не уверен, что это лучший способ.

Вот код:

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(); 

я получаю все @Field от модификации, затем добавьте каждый ключ-значение Params к новому RequestBody, такой же, как эти два Params по умолчанию. Теперь каждый запрос POST имеет «учетную запись» и «токен».

Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Смежные вопросы