Подтвердить что ты не робот

Требуется ли запрос HTTP PUT для включения тела?

У меня возникли проблемы с поиском определенной спецификации этого стандарта. У меня есть HTTP-клиент, который не включает заголовок Content-Length: 0 при выполнении запроса PUT, где я не указываю тело, и сервер, который запутывается такими запросами, и мне интересно, какую программу я должен обвинять.

4b9b3361

Ответ 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;