我正在尝试在Jersey 1.17中创建一个空的PUT请求,以便像这样与Azure Storage REST API进行通信
了HTTPClient
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT,
connectionTimeOut);
config.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT,
readTimeOut);
Client client = Client.create(config);
client.addFilter(new LoggingFilter());
WebResource webResource = client.resource(
"https://" + accountName + "." + storageMedium + "."
+ host)
.path(containerName)
.queryParam("restype", "container");
PUT请求
//
ClientResponse response = webResource
.header(Constants.X_MS_VERSION, "2015-02-21")
.header("x-ms-date", storage.date)
.header("Authorization", authorizationString).put(ClientResponse.class);
服务器的响应是
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Length Required</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Length Required</h2>
<hr><p>HTTP Error 411. The request must be chunked or have a content length.</p>
</BODY></HTML>
我认为问题不在于Azure REST api,因为PUT请求适用于Postman。我不知道我的Jersey客户端有什么问题。有人遇到过类似的情况吗?
答案 0 :(得分:2)
所以我弄清楚问题是什么。在Jersey客户端发送一个空体到PUT请求时,我们需要将一个空字符串设置为客户端的实体。例如
resource.put(ClientResponse.class, "");
这将在http请求中将Content-Length设置为0,将Content-Type设置为“text / plain”。
希望这有帮助!
答案 1 :(得分:0)
我不明白为什么Azure API无法正常工作。 它适用于不同的地方。
<强>示例:强>
... post(String.class, "");
... post(String.class, "{}");
... post(String.class, new byte[]{});
您也可以使用 ClientResponse 类处理响应,例如 response.getStatus()
ClientResponse response = ... post(ClientResponse.class, new byte[]{});
String ret = response.getEntity(String.class);