Jersey 2.x将多个标头添加到ClientConfig

问题描述:

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

我环顾四周,发现我可以创建自定义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)); 

我能得到它分配给一个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)); 

我相信你能做到:

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

是的,正如我所说的,我知道你可以添加这样的标题。但是我需要做不同的调用,使用不同的'path(“asdf”)',并且据我所知,一旦设置了标题,就不能改变路径 - 不要再次调用'target()'。这意味着我必须以某种方式重复调用'header()'和'path()'... – itsbavu