REST API Design: ответьте 406 или 404, если ресурс недоступен в запрошенном представлении - PullRequest
0 голосов
/ 19 сентября 2018

У нас есть REST API для извлечения двоичных файлов с сервера.

Запросы выглядят как

GET /documents/e62dd3f6-18b0-4661-92c6-51c7258f9550 HTTP/1.1
Accept: application/octet-stream

Для каждого ответа, указывающего на ошибку, мы хотели бы указать причинув формате JSON.Проблема заключается в том, что ответ не относится к тому типу контента, который запрашивал клиент.

Но какой ответ должен дать сервер?

В настоящее время он отвечает

HTTP / 1.1 406 Not Acceptable
Content-Type: application/json
{
  reason: "blabla"
  ...
}

, что мне кажется неправильным, поскольку основная проблема заключается в том, чторесурс не существует и клиент не запрашивает неверный тип контента.

Но вопрос в том, как правильно поступить в таких ситуациях?

  • Это нормально?, чтобы ответить 404 + application / json, хотя application / octet-stream был запрошен
  • Можно ли ответить 406 + application / json, так как клиент не указал application / json в качестве приемлемого типа
  • Следует ли расширить спецификацию, чтобы клиент использовал q-параметр - например, application/octet-stream, application/json;q=0.1
  • Другие параметры?

1 Ответ

0 голосов
/ 19 сентября 2018

Если не найдено представление для запрошенного ресурса (поскольку он не существует или сервер хочет "скрыть" его существование), сервер должен вернуть 404.


Если клиент запрашивает конкретное представление в заголовке Accept и сервер недоступен для предоставления такого представления, серверможет либо:

  • Возврат 406 вместе со списком доступных представлений. (см. Примечание ** ниже)
  • Просто игнорируйте заголовок Accept и возвращайте представление ресурса по умолчанию.

См. Следующую цитату из RFC 7231 , документ, который определяет содержание и семантику протокола HTTP / 1.1:

Запрос без какого-либо поля заголовка Accept подразумевает, чтопользовательский агент примет любой тип медиа в ответ.Если поле заголовка присутствует в запросе, и ни одно из доступных представлений для ответа не имеет тип носителя, который указан в качестве приемлемого, сервер происхождения может либо заполнить поле заголовка, отправив ответ 406 (не приемлемо), либо игнорироватьполе заголовка путем обработки ответа, как будто он не подлежит согласованию содержимого.

Mozilla также рекомендует следующее относительно 406:

На практике эта ошибка используется очень редко.Вместо ответа с использованием этого кода ошибки, который будет загадочным для конечного пользователя и трудно исправить, серверы игнорируют соответствующий заголовок и предоставляют пользователю действительную страницу.Предполагается, что даже если пользователь не будет полностью счастлив, он предпочтет это коду ошибки.


** Относительно списка доступных представлений, смотрите этот ответ .

...