Клиент Джерси 1.17 запрос PUT возвращает ошибку 411. Запрос должен быть разделен на части или иметь длину содержимого
Я пытаюсь создать пустой запрос PUT в Jersey 1.17 для связи с API-интерфейсом REST Azure Storage следующим образом
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>
Я не думаю, что проблема связана с API-интерфейсом Azure REST, так как запрос PUT работает в Postman. Я не знаю, в чем проблема с моим клиентом из Джерси. Кто-нибудь сталкивался с подобным сценарием?
2 ответа
Я понял, в чем проблема. В клиенте Джерси для отправки пустого тела в запрос PUT нам нужно установить пустую строку как сущность для вашего клиента. Например
resource.put(ClientResponse.class, "");
это установит Content-Length как 0 и Content-Type как "text/plain" в вашем запросе http.
Надеюсь это поможет!
Я не понимаю, почему 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);