Jersey客户端(2.x)不发送我的GET请求标头

时间:2015-11-13 17:47:33

标签: java rest jersey-2.0 jersey-client

我已经调试了三个小时,我仍然无法解释为什么我的自定义标头(通过客户端请求过滤器注册)不会被发送。

客户端配置如此(完整源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命令才有用!

在尝试定义调用时,我尝试了直接设置标头的方法,但没有成功。

我错过了什么?

0 个答案:

没有答案