volley tutorial example java android rest http-headers retrofit

java - tutorial - ¿Cómo definir un encabezado para todas las solicitudes usando Retrofit?



retrofit tutorial (5)

Aquí está la solución para agregar encabezado usando retrofit 2.1. Necesitamos añadir 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; }

Ahora en su objeto de modificación agregue este encabezado en el cliente

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

Estoy buscando una solución para definir un encabezado único para usar en todas las solicitudes. Hoy uso @Header para cada solicitud que pasó como parámetro, pero quiero definir solo el encabezado que funciona en todas las solicitudes sin que sea necesario que pase como un parámetro, por ejemplo, corregir este encabezado en mis solicitudes @GET y @POST

Hoy uso esto. Tenga en cuenta que cada solicitud @GET necesito definir el encabezado como parámetro.

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


Como las otras respuestas han descrito, necesita un RequestInterceptor . Afortunadamente, esta interfaz tiene un solo método, por lo que Java 8 y superior la tratarán como una interfaz funcional y le permitirán implementarla con un lambda. ¡Sencillo!

Por ejemplo, si está envolviendo una API específica y necesita un encabezado para cada punto final, puede hacer esto cuando construya su adaptador:

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


Dependiendo de su OkHttp lib:

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


Documento oficial:

Los encabezados que deben agregarse a cada solicitud pueden especificarse mediante un RequestInterceptor. El siguiente código crea un RequestInterceptor que agregará un encabezado User-Agent a cada solicitud.

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


En la Retrofit 2 , debe interceptar la solicitud en la capa de red proporcionada por 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();

Mira this , explica muy bien las diferencias.