Но что, если я отправлю GET и основной клиент не существует?
Лучше ли отправить 200 OK с пустым JSON {}
ИлиЛучше всего только отправить 204 Нет контента?
Если я правильно интерпретирую ваш вопрос, вы на самом деле не спрашиваете о кодах состояния, а скорее, какую схему следуетвы используете для управления различными делами в вашем API.
Для таких дел, как REST, когда два конца диалога не обязательно контролируются одной и той же организацией и одним и тем же циклом выпуска, вам может потребоваться учитывать этосторона разговора использует более новую версию схемы, чем другая.
Так как это будет возможно?Наилучшие варианты обработки, которые я видел, фокусируются на разработке схемы для расширения - новые поля являются необязательными и имеют документированную семантику того, как их следует понимать, если поле отсутствует.
С этой точки зрения
{}
Не похоже на представление отсутствующего объекта - оно выглядит как представление объекта со значениями по умолчанию для всех необязательных полей.
Возможно, вам нужно что-то вроде Maybe
или Option
- где вместо того, чтобы пообещать отправить объект назад или нет, вы пообещаете отправить обратно коллекцию из нуля или одного объекта.Коллекции, которые я обычно ожидал бы представлять в JSON в виде массива , а не объекта .
[]
Теперь с , что Идея в кармане, я думаю, что разумно решить, что вы возвращаете представление Maybe
, где представление None
имеет длину в ноль байтов, а представление Some(object)
является представлением JSON объекта.
Так что в этом дизайне 204 при возврате None
имеет большой смысл, и вы можете пообещать, что, если успешный ответ вернет тело, то что-то там действительно есть.
Здесь есть компромисс - форма списка позволяет потребителям всегда анализировать данные, но они должны делать это, даже когда отправляется None
.С другой стороны, использование пустого представления для None экономит парсинг, но требует, чтобы потребитель обращал внимание на длину контента.
Итак, оглядываясь назад на ваши два предложения, я ожидаю, что при использовании 204
будет более успешным долгосрочным подходом.
Другая возможность - вернуть нулевой тип примитива, если вы хотите выразить, что объект недоступен.Это будет сопровождаться ответом 200
, поскольку длина содержимого будет составлять четыре байта.
null