Java HttpURLConnection: вычисление длины содержимого - PullRequest
6 голосов
/ 15 июня 2011

В настоящее время я занимаюсь разработкой библиотеки для проблем с битбакетом RESTful API.Я добился хорошего прогресса, и теперь я собираюсь заняться разделом Обновление проблемы , которая требует HTTP PUT Request.

Теперь я застрял из-за HTTP Error Code 411 Length Required,После небольшого поиска, я нашел следующий пример кода :

// CORRECT: get a UTF-8 encoded byte array from the response
// String and set the content-length to the length of the
// resulting byte array.
String response = [insert XML with UTF-8 characters here];
byte[] responseBytes;
try {
    responseBytes = response.getBytes("UTF-8");
}
catch ( UnsupportedEncodingException e ) {
    System.err.print("My computer hates UTF-8");
}

this.contentLength_ = responseBytes.length;

Теперь мой вопрос: что именно измеряется?

  • строка запроса
  • строка запроса с кодировкой urlen
  • только значения параметров ... ??

И является ли connection.setRequestProperty("Content-Length", String.valueOf(<mycomputedInt>)); подходящим способом установки атрибута длины содержимого?

Примеры приветствуются.Заранее спасибо.


edit:

Например, вы можете объяснить вычисления с помощью следующего примера curl из вики-записи bitbucket:

curl -X PUT -d "content=Updated%20Content" \
https://api.bitbucket.org/1.0/repositories/sarahmaddox/sarahmaddox/issues/1/

Ответы [ 2 ]

6 голосов
/ 15 июня 2011

Вы делаете запрос, верно.Длина содержимого - это количество байтов тела вашего запроса.В вашем случае

int content-length = "content=Updated%20Content".getBytes("UTF-8").length;

Что именно измеряется?

строка запроса в кодировке URL (в теле запроса / сущности)

4 голосов
/ 15 июня 2011

HTTP spec on 411 :

Сервер отказывается принять запрос без заданной длины содержимого.Клиент МОЖЕТ повторить запрос, если он добавит действительное поле заголовка Content-Length, содержащее длину тела сообщения в сообщении запроса.

HTTP-спецификация в заголовке Content-Length :

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET

Спецификация HTTP в HTTPдлина объекта :

entity-body := Content-Encoding( Content-Type( data ) )

Длина объекта сообщения - это длина тела сообщения до применения кодировок передачи.


Подводя итог, если вы хотите отправить несжатую строку UTF-8, вы должны определить байты для отправки как:

Identity( UTF-8( "content=Updated%20Content" ) )

В качестве Content-Length установлено количество выводимых байтов.

Если вы отправляете данные в формате UTF-8, я также настоятельно рекомендую вам установить заголовок Content-Type .

...