headers authenticator java android http-headers retrofit okhttp

java - authenticator - retrofit2 header authorization



¿Cómo agregar encabezados al interceptor de solicitud OkHttp? (6)

Ante un problema similar con otras muestras, esta clase de Kotlin funcionó para mí

import okhttp3.Interceptor import okhttp3.Response class CustomInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain) : Response { val request = chain.request().newBuilder() .header("x-custom-header", "my-value") .build() return chain.proceed(request) } }

Tengo este interceptor que agrego a mi cliente OkHttp:

public class RequestTokenInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // Here where we''ll try to refresh token. // with an retrofit call // After we succeed we''ll proceed our request Response response = chain.proceed(request); return response; } }

¿Cómo puedo agregar encabezados para solicitar en mi interceptor?

Intenté esto pero estoy cometiendo un error y pierdo mi solicitud al crear una nueva solicitud:

public class RequestTokenInterceptor implements Interceptor { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = chain.request(); Request newRequest; try { Log.d("addHeader", "Before"); String token = TokenProvider.getInstance(mContext).getToken(); newRequest = request.newBuilder() .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION + token) .addHeader(HeadersContract.HEADER_CLIENT_ID, CLIENT_ID) .build(); } catch (Exception e) { Log.d("addHeader", "Error"); e.printStackTrace(); return chain.proceed(request); } Log.d("addHeader", "after"); return chain.proceed(newRequest); } }

Tenga en cuenta que sé que puedo agregar encabezado al crear una solicitud como esta:

Request request = new Request.Builder() .url("https://api.github.com/repos/square/okhttp/issues") .header("User-Agent", "OkHttp Headers.java") .addHeader("Accept", "application/json; q=0.5") .addHeader("Accept", "application/vnd.github.v3+json") .build();

Pero no se ajusta a mis necesidades. Lo necesito en interceptor.


Existe otra forma de agregar interceptores en su OkHttp3 (la última versión a partir de ahora), es agregar los interceptores a su generador de Okhttp

okhttpBuilder.networkInterceptors().add(chain -> { //todo add headers etc to your AuthorisedRequest return chain.proceed(yourAuthorisedRequest); });

y finalmente construya su okHttpClient desde este constructor

OkHttpClient client = builder.build();


Finalmente, agregué los encabezados de esta manera:

@Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = chain.request(); Request newRequest; newRequest = request.newBuilder() .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION) .addHeader(HeadersContract.HEADER_X_CLIENT_ID, CLIENT_ID) .build(); return chain.proceed(newRequest); }


Si está utilizando la biblioteca Retrofit, puede pasar directamente el encabezado a la solicitud de API utilizando la anotación @Header sin usar Interceptor. Aquí hay un ejemplo que muestra cómo agregar encabezado a la solicitud de API de Retrofit.

@POST(apiURL) void methodName( @Header(HeadersContract.HEADER_AUTHONRIZATION) String token, @Header(HeadersContract.HEADER_CLIENT_ID) String token, @Body TypedInput body, Callback<String> callback);

¡Espero eso ayude!


aquí hay una lfmingo útil de lfmingo

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


puedes hacerlo de esta manera

private String GET(String url, Map<String, String> header) throws IOException { Headers headerbuild = Headers.of(header); Request request = new Request.Builder().url(url).headers(headerbuild). build(); Response response = client.newCall(request).execute(); return response.body().string(); }