Подходит ли заголовок Content-Type для любого HTTP-глагола, кроме PUT или POST? - PullRequest
3 голосов
/ 21 января 2011

Я опробовал REST API программного обеспечения CollectionSpace и заметил, что отправка ему заголовка Content-Type как части запроса GET приводит к следующей ошибке:

HTTP Status 415 - Cannot consume content type

Обе из клиентских библиотек python REST, которые я пробовал, restclient на github и python-rest-client в коде Google, отправляют заголовок Content-Type при выполнении запросов GET.

Мое понимание из обзора http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html заключается в том, что клиенты должны отправлять заголовки Content-Type только по запросам POST и PUT. Это верно?

Тот факт, что обе эти библиотеки отправили заголовок, заставляет меня думать, что серверы обычно игнорируют его, а не возвращают код ошибки клиента.

Ответы [ 2 ]

5 голосов
/ 21 января 2011

Хотя это явно не указано в спецификации, можно сделать некоторые выводы. Раздел 7.2.1 Состояния

Любое сообщение HTTP / 1.1, содержащее Сущность-тело ДОЛЖНА включать Поле заголовка Content-Type, определяющее тип носителя этого тела.

Это довольно очевидно и имеет смысл. Учитывая это, мы можем взглянуть на Раздел 9 (Определения методов), чтобы увидеть, какие из них упоминают, что они могут иметь сущность в теле запроса. Три из них упоминают это:

OPTIONS

Если запрос OPTIONS включает сущность-тело (как указано наличие Content-Length или Transfer-Encoding) ...

POST

... используется для запроса источника сервер принимает сущность, заключенную в запрос ...

PUT

... запрашивает вложенную сущность храниться под поставляемым Request-URI

И один метод специально запрещает сущности, TRACE :

Запрос TRACE НЕ ДОЛЖЕН включать юридическое лицо.

В действительности вы можете отправить любой метод (кроме TRACE) с сущностью в теле и заголовком Content-Type. Однако, согласно спецификации, я бы не ожидал, что сервер что-то с ним сделает, если только это не будет один из трех описанных выше методов.

<Ч />

Я бы также сказал, что используемое вами программное обеспечение, которое отвечает HTTP Status 415, нарушает спецификацию.

Раздел 4.3 говорит:

... если метод запроса не включить определенную семантику для тело объекта, затем тело сообщения СЛЕДУЕТ игнорировать при обращении с запрос.

Поскольку спецификация не включает определенную семантику для тела сущности с GET-запросом, сервер должен игнорировать это.

Кроме того, если в запросе не было предоставлено ни одного объекта, а Content-Length равен нулю (при условии, что заголовок Transfer-Encoding не установлен и не является «идентичностью»), сервер не должен пытаться использовать объект независимо от метода запроса или есть ли заголовок Content-Type или нет. Это можно сделать в порядке приоритета для определения длины сообщения, описанного в Раздел 4.4 .

2 голосов
/ 13 декабря 2012

415 Невозможно использовать тип содержимого

Эта проблема возникает, если у ресурса REST есть @Consumes, предлагающий принять определенный тип MIME.Чтобы исправить это, установите правильный заголовок «Accept» в вызове запроса / ресурса вместе с заголовком «Content-Type».Для MockHttpRequest от RESTEasy это можно сделать просто как

request.accept (MediaType.APPLICATION_JSON);request.contentType (MediaType.APPLICATION_JSON);

...