У меня возникли проблемы с поиском определенной спецификации этого стандарта. У меня есть HTTP-клиент, который не включает заголовок Content-Length: 0 при выполнении запроса PUT, где я не указываю тело, и сервер, который запутывается такими запросами, и мне интересно, какую программу я должен обвинять.
Требуется ли запрос HTTP PUT для включения тела?
Ответ 1
HTTP-запросы имеют тело, если у них заголовок Content-Length или Transfer-Encoding (RFC 2616 4.3). Если запрос не имеет ни одного, он не имеет тела, и ваш сервер должен рассматривать его как таковой.
Сказано, что для запроса PUT необычно не иметь тела, и поэтому, если бы я проектировал клиента, который действительно хотел отправить пустое тело, я бы передал Content-Length: 0. Действительно, в зависимости от одного чтения из определений метода POST и PUT (RFC 2616 9.5, 9.6) можно утверждать, что тело подразумевается как обязательное - но разумным способом не обрабатывать тело было бы предположить тело с нулевой длиной.
Ответ 2
Не отвечая на вопрос, но утверждая, как jaxrs позволяет мне часто использовать BODYLEX PUT:
Пример bodyless put: Предоставьте пользователю дополнительные разрешения.
PUT/admin/users/{имя пользователя}/разрешение/{разрешение}
Ответ 3
Что такое PUT (в смысле глагола) на сервере, если нет содержимого? spec ссылается на содержимое как на "закрытое сущность", но запрос без содержимого не будет иметь закрытого объекта, и поэтому нечего ставить на сервере.
Если, разумеется, вы не хотите нанести ничего на сервер, и в этом случае вам, скорее всего, понадобится DELETE.
Ответ 4
Тело не требуется по стандарту IETF, хотя длина содержимого должна быть 0, если нет тела. Используйте метод, который подходит для того, что вы делаете. Если бы вы ввели его в код, заданный
int x;
int f(){ return x; }
и удаленной переменной с именем r
.
Сообщение эквивалентно
r=f();
A put эквивалентен
r=x;
а get эквивалентен
x=r;
Ответ 5
Поле длины содержимого требуется в соответствии с следующим разделом в стандарте HTTP/1.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13