2016-04-20 5 views
0

hinzufügen Ich lerne nur Retrofit und OKHttp, jetzt habe ich ein Problem. Jede Anfrage in meiner app ist POST, wie folgt aus:Wie Standardwerte mit Retrofit und OKHttp in jedem Beitrag

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

In jedem POST gibt es zwei gleiche params. So kann ich auf einfachste Weise zwei weitere @Field in jeder Methode hinzufügen, zum Beispiel @Field ("Token"), @ Field ("Account"). Aber ich denke, dass es einen klugen Weg geben muss.

Dann dachte ich OkHttpClient kann das lösen.

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

Oder

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

Die erste Methode ersetzen Sie einfach alle Feld zu diesen beiden.

Die zweite Methode nur diese beiden als GET-Parameter, nicht POST.

Jetzt habe ich absolut keine Ahnung, wie man das funktioniert.

Antwort

1

OK ... Endlich finde ich einen Weg, dies zu tun. Aber ich bin mir nicht sicher, ob das der beste Weg ist. Hier

ist der Code:

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

ich alle @Field von Retrofit, fügen Sie dann alle Schlüssel-Wert-params zu einem neuen RequestBody, gleich wie diese beiden Standard Parameter. Jetzt hat jede POST-Anfrage "account" und "token".

Wenn es eine bessere Möglichkeit gibt, dies zu tun, lass es mich wissen.