2014-11-30 12 views
21

Tüm isteklerde kullanılacak benzersiz bir Başlık tanımlamak için bir çözüm arıyorum. Bugün parametresi gibi geçtin Her isteğe @Header kullanmak ama bu kullanmak @GET ve @POSTYükseltmeyi kullanarak tüm isteklere bir Başlık nasıl tanımlanır?

Bugün benim isteklerinde bu Başlığını sabitleme örneğin, bir parametre gibi geçmesi gerek olmadan tüm isteklere çalışan tek başlığını tanımlamak istiyorum. Her bir isteğin @GET İhtiyacımın Header'ı parametre olarak tanımladığına dikkat edin.

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

       } 
      }); 

     } 

cevap

31

Resmi belge: Bir RequestInterceptor kullanılarak belirtilebilir her isteğine eklenmesi gerekir

Başlıkları. Aşağıdaki kod, her isteğe bir Kullanıcı Aracısı üstbilgisi ekleyecek bir RequestInterceptor oluşturur. Retrofit 2 yılında

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

mükemmeldir: Belirli bir API sarma ve her nokta için bir başlık gerektiği hallerde, size adaptörü oluştururken

Örneğin, bunu yapmak isteyebilirsiniz. RequestInterceptor'ı uygulayan bir 'CustomRequestInterceptor' sınıfı oluşturdum ve şimdi kullanıyorum: 'setRequestInterceptor (yeni CustomRequestInterceptor())' ve çalışır. Çok teşekkürler ! – FernandoPaiva

12

, sen OkHttp

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

kontrol edin this tarafından sağlanan ağ katmanında istek müdahale gerekir, çok iyi farkları açıklar.

2

sizin OkHttp lib bağlı:

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

Burada güçlendirme 2.1 kullanılarak başlık eklemek için çözümdür. Diğer cevaplar açıklandığı gibi, bir RequestInterceptor gerek istemci

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

Bu başlığı eklemek için güçlendirme nesnede Şimdi interceptor

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; 

    } 

eklemeniz gerekir. Neyse ki, bu arabirimin tek bir yöntemi vardır, bu yüzden Java 8 ve üstü, onu işlevsel bir arabirim olarak ele alır ve bir lambda ile uygulamanıza izin verir. Basit!

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