Получение 411 длины, необходимой после запроса PUT от HTTP-клиента

Я работаю над программой Java, которая реализует HTTP-клиент. Я тестирую отправку запросов на сервер. Запросы GET, POST и DELETE работают нормально. Например, после запроса POST я получаю вывод

Data extracted:
{"status":{"message":"ok"}}

и база данных отражает сделанные изменения.

Однако после запроса PUT я получаю следующую html-разметку веб-страницы, указывающую на ошибку.

Data extracted:
<html>
<head><title>411 Length Required</title></head>
<body bgcolor="white">
<center><h1>411 Length Required</h1></center>
<hr><center>nginx/1.2.6</center>
</body>
</html>

и соответственно никаких изменений в базе.

Я обнаружил, что это может иметь какое-то отношение к заголовку Content-Length, но я не уверен. После попытки добавить этот заголовок моя программа ждет минуту, а затем выдает исключение, сообщающее, что она не может обработать ответ сервера.

Я также могу предоставить любой код или трассировку стека, если это необходимо.


person Limbo Exile    schedule 25.03.2013    source источник
comment
Итак, setHeader("Content-Length", "" + file.length()) соотв. setContentLength((int)file.length()); или около того.   -  person Joop Eggen    schedule 25.03.2013
comment
Я не хочу загружать файл. Просто пытаюсь передать URL-адрес с кучей параметров, чтобы обновить базу данных.   -  person Limbo Exile    schedule 25.03.2013
comment
Длина контента 0, как правильно сказал @Sachin.   -  person Joop Eggen    schedule 25.03.2013
comment
Столкнулся с аналогичной проблемой с причалом движка Google, работающим локально. Для меня установка только Content-Length не работала (я получал ту же ошибку 411), поэтому мне пришлось установить фиктивное содержимое в запросе, чтобы заставить его работать.   -  person Denis Kniazhev    schedule 17.05.2018


Ответы (1)


Да, проблема связана с Content-Length. Ошибка HTTP 411 означает

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

Поэтому, когда вы отправляете пустой RequestBody в методе POST/PUT, вам также необходимо отправить Content-Length:0. Поэтому добавьте этот заголовок в свой запрос. Я не думаю, что этот заголовок вызовет проблемы с добавлением вас в объект запроса.

person Sachin    schedule 25.03.2013
comment
Я также пробовал это, в этом случае я получаю Data extracted: {"status":{"message":"Content type 'application/octet-stream' not supported"}} и до сих пор никаких изменений в базе данных - person Limbo Exile; 25.03.2013
comment
Это еще одна проблема, связанная с Content-type. Возможно, ваш сервер не сообщает правильные типы mime или не поддерживает этот тип контента. - person Sachin; 25.03.2013
comment
Я связался с сервером, и они сообщили мне, что протестировали тот же запрос PUT, и он работает с их реализацией HTTP-клиента. Дело в том, что я использую специальную платформу Java ME и предполагаю, что в моей версии HTTP-клиента есть ошибка. Чего я не могу понять, так это того, как это работает с POST? - person Limbo Exile; 25.03.2013
comment
Попробуйте получить значение заголовка Content-Type от того, кто успешно разместил запрос. Я думаю, что это просто ошибка значений заголовка в вашем запросе. - person Sachin; 25.03.2013