Клиент Джерси 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);
Другие вопросы по тегам