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