2011-06-15 6 views
5

В настоящее время я разрабатываю библиотеку для библиотек RESTful для bitbucket. Я достиг хорошего прогресса, и теперь я займусь секцией Updating an Issue, которая требует запроса HTTP PUT.Java HttpURLConnection: вычисление длины содержимого

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

// 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; 

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

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

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

Примеры оценены. Заранее спасибо.


редактировать:

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

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

ответ

5

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

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

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

URL-адрес закодированные строки запроса (если в запросе/теле объекта)

+2

Пожалуйста, не используйте метод getBytes без указания кодировки. –

+0

Я все еще застрял, но я думаю, что это скорее зависит от bitbucket api, чем от того, как я делаю запросы. – phineas

4

HTTP спецификации на 411:

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

HTTP спецификации на Content-Length header:

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

HTTP спецификации на HTTP entity length:

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

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


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

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

Content-Length установлен в количестве байтов.

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

+0

+1 для объяснения спецификации – phineas

Смежные вопросы