2015-08-25 4 views
29

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

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

+1

Ваш перехватчик выглядит правильно. Что с ним не работает? –

ответ

79

Наконец, я добавил заголовки таким образом:

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

почему-то это не добавляет заголовки к моей просьбе ?! Я использую okHttp.Builder и networkInterceptors(). Add (перехватчик) с тем же кодом, что и в этом ответе, но заголовки не добавляются. – Informatic0re

6

Если вы используете библиотеку 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); 

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

+2

Я знаю это, но у меня есть способ получить токен с именем: getToken(), который имеет ожидание в потоке. поэтому, если я назову это в перехватчике OkHttp, он будет работать в потоке с обновлением, и мне не нужно беспокоиться о проблемах с потоками. –

2

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

okhttpBuilder.networkInterceptors().add(chain -> { 
//todo add headers etc to your AuthorisedRequest 

    return chain.proceed(yourAuthorisedRequest); 
}); 

и, наконец, построить свой okHttpClient от этого строителя

OkHttpClient client = builder.build(); 
8

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

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