2015-10-05 4 views
35

Ich muss einen Abfrageparameter zu jeder Anforderung hinzufügen, die von Retrofit 2.0.0-Beta2-Bibliothek erstellt wird. Ich habe this solution für Retrofit 1.9 gefunden, aber wie fügt man RequestInterceptor in der neuesten Bibliotheksversion hinzu?Gibt es eine Möglichkeit, jedem Request mit Retrofit 2 Abfrageparameter hinzuzufügen?

Meine Schnittstelle:

@GET("user/{id}") 
Call<User> getUser(@Path("id")long id); 

@GET("users/") 
Call<List<User>> getUser(); 

Auftraggeber:

Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .client(CLIENT) // custom OkHTTP Client 
        .build(); 
service = retrofit.create(userService.class); 
+0

Wenn Sie einen Abfrage-Parametern in dem Interceptor hinzuzufügen verwaltet, könnten Sie den Code in Ihrer Frage oder in einer Reaktion der eigenen Frage hinzufügen? –

Antwort

66

Aus Gründen der Vollständigkeit, hier ist der vollständige Code, den Sie benötigen einen Parameter für jeden Retrofit 2.x Anforderung mit einem OkHttp-Interceptor hinzuzufügen:

OkHttpClient client = new OkHttpClient(); 

client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     HttpUrl url = request.url().newBuilder().addQueryParameter("name","value").build(); 
     request = request.newBuilder().url(url).build(); 
     return chain.proceed(request); 
    } 
}); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("...") 
     .client(client) 
     .build(); 
+13

'httpUrl()' Methode im 'Request' Objekt wurde in' url() 'in der neuesten Version von OkHttp geändert – Singed

+8

' interceptors() 'gibt unveränderliche' List' in '3.2.0' zurück. Verwenden Sie stattdessen 'addInterceptor()' in 'OkHttpClient.Builder'. –

+1

Der hinzugefügte Parameter wird in GET festgelegt. Dies kann ein Problem sein, wenn Sie einen anderen Anforderungstyp verwenden müssen. – tryp

4

Sie auf ein Interceptor von OkHttp zu wechseln. Erstellen Sie eine OkHttpClient, fügen Sie die Interceptor zu ihm einen Pass, der Client in der Retrofit Builder.

OkHttpClient client = new OkHttpClient(); 
client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     ... 
    } 
}); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("...") 
     .client(client) 
     .build(); 

Sie können dann die Anforderung an Ihre Bedürfnisse anpassen chain.request().newBuilder() verwenden. Einzelheiten finden Sie unter documentation.

+3

Es wird absolut nicht erläutert, wie ein Abfrageparameter hinzugefügt wird. Es erklärt nur, wie man abfängt, aber ich fand nur eine Möglichkeit, Header hinzuzufügen, und das OP und ich möchten einen Abfrageparameter hinzufügen –

+3

Sie können die Anforderungskette nach Ihren Bedürfnissen ändern, finden Sie in der OkHttp-Dokumentation für Details. (Beispiel: chain.proceed (chain.request(). newBuilder(). url (chain.request(). httpUrl(). newBuilder(). addQueryParameter ("Name", "Wert"). build()). build()); // http://square.github.io/okhttp/javadoc/com/squadeup/okhttp/HttpUrl.Builder.html#addQueryParameter-java.lang.String-java.lang.String-) – sebastian

+0

Sie 'hast recht. Als sich die API änderte, war es schwieriger herauszufinden, wie die Abfrageparameter hinzugefügt wurden. Daher half mir die Lösung nicht weiter, bis ich herausfand, dass httpurl auch eine newBuilder-Methode hatte. Ich denke, Sie sollten es zu Ihrer Frage hinzufügen –

5

jetzt das Retrofit freizusetzen 2.0.0 und dies ist meine Lösung:

OkHttpClient client = new OkHttpClient.Builder() 
         .addInterceptor(new Interceptor() { 
          @Override 
          public Response intercept(Chain chain) throws IOException { 

           String uid = "0"; 
           long timestamp = (int) (Calendar.getInstance().getTimeInMillis()/1000); 
           String signature = MD5Util.crypt(timestamp + "" + uid + MD5_SIGN); 
           String base64encode = signature + ":" + timestamp + ":" + uid; 
           base64encode = Base64.encodeToString(base64encode.getBytes(), Base64.NO_WRAP | Base64.URL_SAFE); 

           Request request = chain.request(); 
           HttpUrl url = request.url() 
             .newBuilder() 
             .addQueryParameter("pageSize", "2") 
             .addQueryParameter("method", "getAliasList") 
             .build(); 

           request = request 
             .newBuilder() 
             .addHeader("Authorization", "zui " + base64encode) 
             .addHeader("from_client", "ZuiDeer") 
             .url(url) 
             .build(); 

           Response response = chain.proceed(request); 

           return response; 
          } 
         }).build(); 


       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl(ApiConstants.API_BASE_URL) 
         .client(client) 
         .addConverterFactory(GsonConverterFactory.create()) 
         .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
         .build(); 

       mRestfulService = retrofit.create(RestfulService.class); 
1

in 3.2.0 und höher Sie addInterceptor() in OkHttpClient.Builder stattdessen verwenden sollten.

Zum Beispiel mit Retrolambda:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor() 
     .setLevel(HttpLoggingInterceptor.Level.BASIC); 

Interceptor clientInterceptor = chain -> { 
    Request request = chain.request(); 
    HttpUrl url = request.url().newBuilder().addQueryParameter("name", "value").build(); 
    request = request.newBuilder().url(url).build(); 
    return chain.proceed(request); 
}; 

OkHttpClient client = new OkHttpClient.Builder() 
     .addNetworkInterceptor(clientInterceptor) 
     .addInterceptor(loggingInterceptor) 
     .build(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 
Verwandte Themen