Как добавить заголовки в перехватчик запросов OkHttp?

У меня есть этот перехватчик, который я добавляю к моему клиенту 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; } } 

Как я могу добавить заголовки для запроса в моем перехватчике?

Я пробовал это, но я делаю ошибку, и я теряю свой запрос при создании нового запроса:

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

Обратите внимание, что я знаю, что могу добавить заголовок при создании запроса следующим образом:

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

Но это не соответствует моим потребностям. Мне нужно это в перехватчике.

Наконец, я добавил заголовки следующим образом:

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

Если вы используете библиотеку Retrofit, вы можете напрямую передать заголовок в запрос api, используя аннотацию @Header без использования Interceptor. Вот пример, который показывает, как добавить заголовок для запроса api Retrofit.

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

Надеюсь, поможет!

Есть еще один способ добавить перехватчики в ваш OkHttp3 (последняя версия на данный момент), то есть вы добавляете перехватчики в свой Okhttp-конструктор

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

И, наконец, построим ваш okHttpClient из этого строителя

 OkHttpClient client = builder.build(); 

Вы можете сделать это таким образом

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