使用实体获取HttpPost的所有标头

时间:2016-04-24 20:59:37

标签: java apache-httpclient-4.x

我正在使用HttpClient向Azure发送带有正文的PUT请求。 正文由StringEntity表示。

我需要将Azure身份验证签名添加到请求中,为了正确计算它,我需要Content-Type和Content-Length标头的值。

当在HttpPost请求上调用setEntity()方法时,没有标头被添加到请求中,但是使用HTTP调试代理我可以看到它们与请求一起正确发送。

从Apache文档(here)我看到我可以使用entity.getContentLength()和entity.getContentType()来计算这些,但我更愿意直接从HttpPost中提取数据。 / p>

在执行请求之前,任何人都知道强制实体将标头添加到请求的方法吗?

这是我使用

的代码
HttpPut createBlob = new HttpPut(createBlobUrl);
createBlob.addHeader("x-ms-blob-type", "BlockBlob");
createBlob.addHeader("x-ms-date", utcTime);
createBlob.addHeader("x-ms-version", "2015-04-05");

HttpEntity body =  new StringEntity("test blob", "UTF-8");
createBlob.setEntity(body);

// h is missing Content-Length and Content-Type
Header[] h = createBlob.getAllHeaders();

resp = httpclient.execute(createBlob);

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

向客户端添加拦截器,我可以在执行之前获取包含所有头的完整请求,因此我不需要处理实体添加头的特殊情况。

HttpClientBuilder builder = HttpClientBuilder.create();
builder = builder.disableContentCompression().disableConnectionState();

builder.addInterceptorLast((HttpRequestInterceptor) (request, context) -> {
    try {
        SignRequest(request, account, secret);
     }
     catch (Exception e) {
     }
});

HttpClient httpclient = builder.build();

有关拦截器的官方教程可以找到at this link