Что такое правильный формат ответа и код состояния, когда ресурс существует, но срок его действия истек?
Важная вещь, которую необходимо понять в REST, заключается в том, что наш API - это фасад , специально разработанный для того, чтобы наш домен выглядел как любое другое хранилище документов в Интернете, так что все веб-инструменты общего назначения "просто работают".
Другой способ сказать то же самое: HTTP это приложение в домене для передачи документов по сети . Когда мы создаем API REST, мы делаем то, что адаптируем наши доменные протоколы к языку обмена документами с клиентом.
Коды состояния и заголовки принадлежат транспортным документам через сетевой домен.
GET: /api/employees/123
Правильный ответ на этот вопрос во многом зависит от того, имеется ли у нас текущее представление этого ресурса (что касается домена транспортных документов). Семантика 1017 * этого представления в нашем домене действительно не входит в него.
Если у нас есть текущее представление ресурса, то это штраф
200 OK
Content-Type: application/json
{
"id": 123,
"workPermitExpired": true,
"errorMessage": "Employee work permit expired"
}
Когда мы не можем удовлетворить запрос на предоставление текущего ресурса, мы обычно будем использовать код состояния, который указывает компонентам общего назначения, что тело ответа описывает состояние ошибки, а не представление ресурса.
404 Not Found
Content-Type: application/json
{ "error": "Who is 123?" }
это не кажется правильным, так как ответ 200 не должен иметь различную структуру в зависимости от идентификатора ресурса.
Верно. Обычно это означает, что вы должны определить свою схему более тщательно. Если вы ожидаете включить или выключить некоторые поля в представлении, то в определении схемы необходимо описать эти поля как необязательные. Например, мы могли бы описать схему «активного разрешения» и схему «истекшего разрешения» (под другим ключом) с ограничением, что клиент должен ожидать одно или другое, но не оба.
Другая возможность использовать разные типы контента для разных представлений. RF C 6838 - это место, где вы ищите подробности, но в общих чертах мы можем определить две разные схемы, а затем присвоить каждой схеме отдельный тип контента
- application / prs.maciej-active-allow + json
- application / prs.maciej-expired-allow + json
application/+json
сообщает потребителям общего назначения, что представления «просто» json документов, но потребители, знакомые с указанными вами c типами носителей, будут иметь более конкретное c понимание для работы.
RF C 7807 является стандартизированной демонстрацией этого подхода, где заданная c семантика для имен полей кодируется в json документе, а тип носителя application/problem+json
сообщает компонентам общего назначения, что на самом деле происходит.
Вы видите похожую идею в application / merge-patch + json и application / json -patch + json.