【问题标题】:Okhttp3: Add global header to all requests errorOkhttp3:将全局标头添加到所有请求错误
【发布时间】:2020-08-25 08:06:42
【问题描述】:

我想为我的所有请求定义一个全局标头。我正在使用 okhttp3。 我在论坛里搜索了这里,找到了一种方法,我尝试实现:

public static void main(String[] args) throws Exception {
    OkHttpClient httpClient = new OkHttpClient();
    httpClient.networkInterceptors().add(new Interceptor() {
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request().newBuilder()
                    .method("GET", null)
                    .addHeader("Accept", headerType)
                    .addHeader(headerAuthorization, headerAuthorizationValue)
                    .build();

            return chain.proceed(request);
        }
    });

    Request request = new Request.Builder()
            .url(Connection.BASE_URL)
            .build();

    okhttp3.Response response = httpClient.newCall(request).execute();
    String responseData = response.body().string();
    System.out.println(responseData);
}

但是,我在执行过程中遇到错误,我认为它与拦截器有关。例外情况如下:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1062)
at jira.Program.main(Program.java:25)

有谁知道我的错误是什么并可以帮助我吗?提前致谢!

【问题讨论】:

  • 第 25 行?
  • 第 25 行是 httpClient.networkInterceptors().add(new Interceptor()
  • 请阅读我关于失败原因的回答。

标签: java okhttp interceptor


【解决方案1】:

根据文档 httpClient.networkInterceptors()

返回观察单个网络请求和响应的拦截器的不可变列表。

由于它是一个不可变列表,因此您不能向其中添加元素,即在 networkInterceptors().add(...) 上抛出一个 java.lang.UnsupportedOperationException

编辑:

为了解决这个问题,请替换new OkHttpClient();

new OkHttpClient.Builder().addInterceptor(...).build().

【讨论】:

  • 谢谢你的回答,我现在明白了。因此,我将“networkInterceptors()”替换为“Interceptors()”,但同样的错误发生了,尽管如果我理解正确的话,Interceptors 应该“返回可修改的拦截器列表...”。
  • 不,这里也一样:“返回一个不可变的拦截器列表”...
  • 是的,你是对的。我将其更改为:httpClient.newBuilder().interceptors().add(new Interceptor()... 现在它正在工作,但这对吗?对我来说看起来很奇怪。
  • 请在我的回答中以不同的方式构建您的 HttpClient
  • @qwertz 是的,使用构建器而不是构造器来创建对象是一种常见的模式(构建器模式)。
【解决方案2】:

您能否尝试只使用拦截器而不是网络拦截器,因为网络拦截器有特殊用途,例如重定向和重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多