获取带有实体的 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
我正在使用 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