我正在使用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);
答案 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