wake-up-neo.com

Wie definiere ich einen Header für alle Anfragen mit Retrofit?

Ich suche nach einer Lösung, um einen eindeutigen Header zu definieren, der in allen Anforderungen verwendet wird. Heute benutze ich @Header für jede Anfrage, die wie ein Parameter übergeben wurde, aber ich möchte nur einen Header definieren, der in allen Anfragen funktioniert, ohne wie ein Parameter übergeben zu werden, zum Beispiel das Korrigieren dieses Headers für meine Anfragen @GET und @POST

Heute benutze ich das. Beachten Sie, dass für jede Anforderung @GET Header als Parameter definiert werden muss.

//interface
@GET("/json.php")
void getUsuarioLogin(   
                        @Header("Authorization") String token,
                        @QueryMap Map<String, String> params,
                        Callback<JsonElement> response
                    );

//interface
@GET("/json.php")
void addUsuario(    
                        @Header("Authorization") String token,
                        @QueryMap Map<String, String> params,
                        Callback<JsonElement> response
                    );


//using
public void getUsuarioLogin(){
        Map<String, String> params = new HashMap<String, String>();         
        params.put("email", "[email protected]");
        params.put("senha", ConvertStringToMD5.getMD5("mypassword"));           

        RestAdapter adapter = new RestAdapter.Builder()
                                .setLogLevel(RestAdapter.LogLevel.FULL)
                                .setEndpoint(WebServiceURL.getBaseWebServiceURL())                              
                                .build();

        UsuarioListener listener = adapter.create(UsuarioListener.class);
        listener.getUsuarioLogin(
                                      //header  
                                      "Basic " + BasicAuthenticationRest.getBasicAuthentication(),
                                      params, 
                                      new Callback<JsonElement>() {         
            @Override
            public void success(JsonElement arg0, Response arg1) {
                Log.i("Usuario:", arg0.toString() + "");                
            }

            @Override
            public void failure(RetrofitError arg0) {
                Log.e("ERROR:", arg0.getLocalizedMessage());

            }
        }); 

    }





//using
    public void addUsuario(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("name", "Fernando");
            params.put("lastName", "Paiva");

            RestAdapter adapter = new RestAdapter.Builder()
                                    .setLogLevel(RestAdapter.LogLevel.FULL)
                                    .setEndpoint(WebServiceURL.getBaseWebServiceURL())                              
                                    .build();

            UsuarioListener listener = adapter.create(UsuarioListener.class);
            listener.addUsuario(
                                          //header  
                                          "Basic " + BasicAuthenticationRest.getBasicAuthentication(),
                                          params, 
                                          new Callback<JsonElement>() {         
                @Override
                public void success(JsonElement arg0, Response arg1) {
                    Log.i("Usuario:", arg0.toString() + "");                
                }

                @Override
                public void failure(RetrofitError arg0) {
                    Log.e("ERROR:", arg0.getLocalizedMessage());

                }
            }); 

        }
22
FernandoPaiva

Offizielles Dokument:

Header, die zu jeder Anfrage hinzugefügt werden müssen, können mit einem RequestInterceptor angegeben werden. Mit dem folgenden Code wird ein RequestInterceptor erstellt, der jeder Anforderung einen User-Agent-Header hinzufügt.

RequestInterceptor requestInterceptor = new RequestInterceptor() {
  @Override
  public void intercept(RequestFacade request) {
    request.addHeader("User-Agent", "Retrofit-Sample-App");
  }
};

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setRequestInterceptor(requestInterceptor)
.build();
31
daveztong

In Retrofit 2 müssen Sie die Anforderung auf der von OkHttp bereitgestellten Netzwerkschicht abfangen.

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
httpClient.addInterceptor(new Interceptor() {  
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
    Request original = chain.request();

    Request request = original.newBuilder()
        .header("User-Agent", "Your-App-Name")
        .header("Accept", "application/vnd.yourapi.v1.full+json")
        .method(original.method(), original.body())
        .build();

    return chain.proceed(request);
   }
}

OkHttpClient client = httpClient.build();  
Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .build();

Check this , erklärt die Unterschiede sehr gut.

16
Silvia H

Abhängig von Ihrer OkHttp-Bibliothek:

OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request().newBuilder().addHeader("User-Agent", System.getProperty("http.agent")).build();
        return chain.proceed(request);
    }
});
Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(httpClient)
    .build();
2
jobbert

Wie in den anderen Antworten beschrieben, benötigen Sie eine RequestInterceptor. Glücklicherweise verfügt diese Schnittstelle über eine einzige Methode. Daher wird sie von Java 8 und höher als funktionale Schnittstelle behandelt und mit einem Lambda implementiert. Einfach!

Wenn Sie beispielsweise eine bestimmte API umschließen und für jeden Endpunkt einen Header benötigen, können Sie dies beim Erstellen des Adapters tun:

RestAdapter whatever = new RestAdapter.Builder().setEndpoint(endpoint)
                                                .setRequestInterceptor(r -> r.addHeader("X-Special-Vendor-Header", "2.0.0"))
                                                .build()
1

Hier ist die Lösung für das Hinzufügen von Kopfzeilen mithilfe von Retrofit 2.1. Wir müssen Interceptor hinzufügen

 public OkHttpClient getHeader(final String authorizationValue ) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .addNetworkInterceptor(
                        new Interceptor() {
                            @Override
                            public Response intercept(Interceptor.Chain chain) throws IOException {
                                Request request = null;
                                if (authorizationValue != null) {
                                    Log.d("--Authorization-- ", authorizationValue);

                                    Request original = chain.request();
                                    // Request customization: add request headers
                                    Request.Builder requestBuilder = original.newBuilder()
                                            .addHeader("Authorization", authorizationValue);

                                    request = requestBuilder.build();
                                }
                                return chain.proceed(request);
                            }
                        })
                .build();
        return okClient;

    }

Fügen Sie nun in Ihrem Retrofit-Objekt diesen Header im Client hinzu

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getHeader(authorizationValue))
                .addConverterFactory(GsonConverterFactory.create())
                .build();
0
swetabh suman