我已经调试了三个小时,我仍然无法解释为什么我的自定义标头(通过客户端请求过滤器注册)不会被发送。
客户端配置如此(完整源here):
private WebTarget webTarget(String host, String appId, String appKey) {
return newClient(clientConfiguration(appId, appKey))
.target(host + "/rest");
}
private Configuration clientConfiguration(String appId, String appKey) {
ClientConfig config = new ClientConfig();
config.register(requestFilter(appId, appKey));
return config;
}
private ClientRequestFilter requestFilter(String appId, String appKey) {
return new VidalRequestFilter(apiCredentials(appId, appKey));
}
过滤器如下:
public class VidalRequestFilter implements ClientRequestFilter {
private final ApiCredentials credentials;
public VidalRequestFilter(ApiCredentials credentials) {
this.credentials = credentials;
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
MultivaluedMap<String, Object> headers = requestContext.getHeaders();
headers.add(ACCEPT, APPLICATION_ATOM_XML_TYPE);
headers.add("app_id", credentials.getApplicationId());
headers.add("app_key", credentials.getApplicationKey());
}
}
电话就像:
String response = webTarget
.path("api/packages")
.request()
.get()
.readEntity(String.class);
我得到的全部是403被禁止,因为我正在调用的特定端点受到保护(使用上面定义的自定义头执行auth)。
最奇怪的是,在我进行调试时,我发现在请求写入期间正确调用了sun.net.www.MessageHeader
(即实例的值如下:sun.net.www.MessageHeader@14f9390f7 pairs: {GET /rest/api/packages HTTP/1.1: null}{Accept: application/atom+xml}{app_id: XXX}{app_key: YYY}{User-Agent: Jersey/2.22.1 (HttpUrlConnection 1.8.0_45)}{Host: ZZZ}{Connection: keep-alive}
。
但是,我确认我们的API服务器及其反向代理都没有收到带有所需auth标头的GET请求(但是第一个HEAD请求似乎没问题)。
我肯定知道凭据是好的&#39;因为等效的curl命令才有用!
在尝试定义调用时,我尝试了直接设置标头的方法,但没有成功。
我错过了什么?