【问题标题】:Jersey 2.x add multiple headers to ClientConfigJersey 2.x 向 ClientConfig 添加多个标头
【发布时间】:2025-11-22 20:05:01
【问题描述】:

我在这里查看了不同的答案,它们都是关于在请求调用期间添加标头。我想在客户端配置中添加标头,然后将其注册到客户端本身。

我环顾四周,发现我可以创建自定义 ClientRequestFilter,但查看 add() 方法签名,我没有看到可以添加多个标头的任何内容 - 它们都像字符串一样作为第一个参数,然后像列表一样。

例如,我想添加这些标题:

Accept: 'something'
Client-ID: 'another something'
Authorization: 'OAuth more something'

我想出了下面的代码,但似乎只使用了第一个register() 方法调用。我检查了调试器,我看到的只是第一个 Accept 标头和 Jersey 添加的 User-Agent 标头。

public OAuth2Authenticator(String header, String value) {
    this.header = header;
    this.value = value;
}

@Override
public void filter(ClientRequestContext requestContext) throws IOException {
    requestContext.getHeaders().add(header, value);
}


...

client = ClientBuilder.newClient(new ClientConfig());
client.register(new OAuth2Authenticator(HttpHeaders.ACCEPT, API_VERSION))
      .register(new OAuth2Authenticator("Client-ID", clientId))
      .register(new OAuth2Authenticator(HttpHeaders.AUTHORIZATION, "OAuth " + accessToken));

【问题讨论】:

    标签: java http-headers jersey-2.0 jersey-client


    【解决方案1】:

    我相信你可以做到:

    client.target("")
                 .request()
                 .header("Accept","something")
                 .header("Client-ID", "another something");
    

    【讨论】:

    • 是的,正如我所提到的,我知道您可以添加这样的标题。但是我需要使用不同的path("asdf") 进行不同的调用,据我所知,一旦设置了标题,就无法更改路径 - 无需先再次调用target()。这意味着我必须以某种方式反复调用header()path()...
    【解决方案2】:

    我能够通过首先分配给 MultivalueMap,然后调用 add() 来使其工作。

    MultivaluedMap<String, Object> headers = requestContext.getHeaders();
    headers.add(HttpHeaders.ACCEPT, "something");
    headers.add("Client-ID", another something);
    headers.add(HttpHeaders.AUTHORIZATION, "OAuth more something");
    
    ...
    
    client = ClientBuilder.newClient(new ClientConfig());
    client.register(new OAuth2Authenticator( API_VERSION, clientId, accessToken));
    

    【讨论】: