获取带有实体的 HttpPost 的所有 headers

Get all the headers for HttpPost with entity

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

我需要将 Azure 身份验证签名添加到请求中,为了正确计算它,我需要 Content-Type 和 Content-Length headers.[=13 的值=]

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

从 Apache 文档 (here) 我看到我可以使用 entity.getContentLength() 和 entity.getContentType() 来计算它们,但我更愿意直接从中提取数据如果可能,HttpPost。

有人知道在执行请求之前强制实体将 headers 添加到请求中的方法吗?

这是我正在使用的代码

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);

我找到了解决办法。

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

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