【问题标题】:How to add headers to OkHttp request interceptor?如何将标头添加到 OkHttp 请求拦截器?
【发布时间】:2015-11-18 17:02:50
【问题描述】:

我将这个拦截器添加到我的 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();

但这不符合我的需要。我需要它在拦截器中。

【问题讨论】:

  • 你的拦截器看起来不错。什么不工作?

标签: java android http-headers retrofit okhttp


【解决方案1】:

最后,我以这种方式添加了标题:

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

【讨论】:

  • 出于某种原因,这不会将标题添加到我的请求中?!我正在使用 okHttp.Builder 和 networkInterceptors().add(interceptor) 与此答案中的代码相同,但未添加标头。
  • 如何为 youtube 请求添加标头?是packageName和你的API密钥然后通过.addheader(params1, params2);
  • @RoCk 你可以有单独的RestClients,它们有不同的头配置。
【解决方案2】:

你可以这样做

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

【讨论】:

  • 这不是拦截器。
【解决方案3】:

这是来自lfmingo的有用gist

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

【讨论】:

    【解决方案4】:

    面临与其他示例类似的问题,这个 Kotlin 类对我有用

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

    【讨论】:

      【解决方案5】:

      如果您使用的是 Retrofit 库,那么您可以使用 @Header 注释直接将标头传递给 api 请求,而无需使用 Interceptor。这是一个示例,展示了如何向 Retrofit api 请求添加标头。

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

      希望对你有帮助!

      【讨论】:

      • 我知道,但我有一个方法来获取名为:getToken() 的令牌,它在线程上等待。所以如果我在 OkHttp 拦截器中调用它,它将在改造线程中运行,我不需要担心线程问题。
      【解决方案6】:

      还有另一种方法可以在 OkHttp3(截至目前的最新版本)中添加拦截器,即将拦截器添加到 Okhttp 构建器中

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

      最后从这个构建器构建你的 okHttpClient

      OkHttpClient client = builder.build();
      

      【讨论】:

      • 是的,没有注意到关于add*Network*Interceptor 而不是addInterceptor 的部分让我拉了几个小时的头发:)
      【解决方案7】:

      Kotlin 版本:

      fun okHttpClientFactory(): OkHttpClient {
          return OkHttpClient().newBuilder()
              .addInterceptor { chain ->
                  chain.request().newBuilder()
                      .addHeader(HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION)
                      .build()
                      .let(chain::proceed)
              }
              .build()
      }
      
      

      【讨论】:

        【解决方案8】:

        这对我有用:

        class JSONHeaderInterceptor : Interceptor {
            override fun intercept(chain: Interceptor.Chain) : Response {
                val request = chain.request().newBuilder()
                    .header("Content-Type", "application/json")
                    .build()
                return chain.proceed(request)
            }
        }
        
        fun provideHttpClient(): OkHttpClient {
            val okHttpClientBuilder = OkHttpClient.Builder()
            okHttpClientBuilder.addInterceptor(JSONHeaderInterceptor())
            return okHttpClientBuilder.build()
        }
        

        【讨论】:

          【解决方案9】:
          package com.example.network.interceptors;
          
          import androidx.annotation.NonNull;
          
          import java.io.IOException;
          import java.util.Map;
          
          import okhttp3.Interceptor;
          import okhttp3.Request;
          import okhttp3.Response;
          
          public class RequestHeadersNetworkInterceptor implements Interceptor {
          
              private final Map<String, String> headers;
          
              public RequestHeadersNetworkInterceptor(@NonNull Map<String, String> headers) {
                  this.headers = headers;
              }
          
              @NonNull
              @Override
              public Response intercept(Chain chain) throws IOException {
                  Request.Builder builder = chain.request().newBuilder();
                  for (Map.Entry<String, String> header : headers.entrySet()) {
                      if (header.getKey() == null || header.getKey().trim().isEmpty()) {
                          continue;
                      }
                      if (header.getValue() == null || header.getValue().trim().isEmpty()) {
                          builder.removeHeader(header.getKey());
                      } else {
                          builder.header(header.getKey(), header.getValue());
                      }
                  }
                  return chain.proceed(builder.build());
              }
          
          }
          

          使用示例:

          httpClientBuilder.networkInterceptors().add(new RequestHeadersNetworkInterceptor(new HashMap<String, String>()
          {
              {
                  put("User-Agent", getUserAgent());
                  put("Accept", "application/json");
              }
          }));
          

          【讨论】:

            【解决方案10】:
            client = new OkHttpClient();
            
                    Request request = new Request.Builder().header("authorization", token).url(url).build();
                    MyWebSocketListener wsListener = new MyWebSocketListener(LudoRoomActivity.this);
                    client.newWebSocket(request, wsListener);
                    client.dispatcher().executorService().shutdown();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-06-23
              • 1970-01-01
              • 2017-08-23
              • 2019-03-03
              • 2019-01-20
              • 2019-09-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多