2012-06-08 11 views
1

Я хотел знать, как я должен ответить в моем REST API.понимание ответа REST и кода состояния HTTP

Действительно Пример:

http://blah.com/api/v1/dosomething/123 

выше действительный запрос и в настоящее время у меня есть HTTP Status 200 с ответом JSON

{ 
    "dosomething": { 
     "status": "OK", 
     "results": "123" 
    } 
} 

Теперь мой вопрос, если передаваемый параметр недействителен (я ожидаю строку целых чисел), возвращаю ли ответ HTTP 200 из 200 и передаю статус ошибки в ответ JSON или должен передать что-то вроде ответа HTTP 400 (неверный запрос) и перечислить ошибку/вопрос с запросом в ответ JSON?

Ошибка Пример:

http://blah.com/api/v1/dosomething/123a 

JSON ответ:

{ 
    "dosomething": { 
     "status": "ERROR", 
     "errors": [ 
      "Value passed: |123a| must be a integer." 
     ] 
    } 
} 

Опять мой вопрос я должен передать состояние 200 или 400 HTTP по запросу, где передаваемый параметр не то, что я ожидали? Или это всегда будет ответ 200, когда запрос работает?

Что считается лучшей практикой?

ответ

5

Использование 404. Всегда. 404. Иными словами, неправильно понимать природу URI и ресурса.Если http://blah.com/api/v1/dosomething/ идентифицировал ресурс, а 123a были просто параметром для него, тогда могли бы иметь смысл другие коды. Но это не так: http://blah.com/api/v1/dosomething/123 определяет ресурс. Если такого ресурса нет, верните 404 Not Found.

Вы могли бы иметь некоторые детали реализации, которые обрабатывает как ресурсы http://blah.com/api/v1/dosomething/123 и http://blah.com/api/v1/dosomething/123a, но это не ресурс. От Рой Филдинг dissertation:..

«Ресурс не является объект хранения Ресурс не механизма, который использует сервер для обработки объекта хранения ресурса представляет собой концептуальное отображение - сервер получает идентификатор (который идентифицирует сопоставление) и применяет его к его текущему сопоставлению (обычно это комбинация глубинного дерева для сбора данных обходных и/или хэш-таблиц), чтобы найти в настоящее время ответственную реализацию обработчика , а реализация обработчика затем выбирает Соответствующее действие + ответ на основе содержимого запроса. Все эти проблемы, связанные с реализацией, скрыты за веб-интерфейсом; их природа не может считаться клиентом, который имеет доступ только через веб-интерфейс.»

-2

HTTP 400 используется для обозначения проблемы с самим запросом HTTP (например, недопустимым HTTP-заголовком). Несмотря на то, что вы не получаете ожидаемые параметры, запрос по-прежнему является действительным HTTP-запросом, поэтому я бы возвратил ответ 200, но включил данные о недостающем параметре в вашем JSON.

+0

Это распространенное заблуждение. 400 ошибка клиентского приложения, так что может представлять собой целый ряд случаев отказа. Последние Спецификация Httpbis изменила формулировку ошибки 400, чтобы показать, что ее можно применять более широко http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-19#section-7.4.1 –

4

Редактировать автор: 422 неверный ответ. Я неправильно понял первоначальный вопрос и дал недействительный ответ. См. Ответ от @fumanchu: https://stackoverflow.com/a/10955717/441250. Мой ответ ниже неверен.

Я предлагаю использовать «422 Unprocessable Entity» и включать информацию об отказах в тело вашего ответа.

422 (Unprocessable Entity) код состояния означает, что сервер
понимает тип содержимого запроса объекта (следовательно,
415 (неподдерживаемый тип носителя) код состояния является несоответствующим), а
синтаксиса объект запроса является правильным (таким образом, код статуса 400 (неудачный запрос)
10 не подходит), но не смог обработать содержащиеся в нем инструкции . Например, это условие ошибки может возникнуть, если тело запроса XML
содержит корректно сформированные (то есть синтаксически правильные), но
семантически ошибочные инструкции XML.

Недопустимо использовать «200 Ok» или любые другие коды состояния при работе с ошибками.

P.S. Список кодов состояния: http://www.iana.org/assignments/http-status-codes/http-status-codes.xml

+0

Итак, есть правильный HTTP-статус для ответа. Имеет ли значение, если я использую версию протокола HTTP версии 1.0 или 1.1? –

+1

Phil: это не имеет значения, но тогда - в этом случае - 422 - это не правильный ответ. стартеры, в этом запросе нет полезной нагрузки (объекта запроса). (422 - правильный ответ в случае других случаев) –

+0

@ Джулиан, вы абсолютно правы, я неправильно понял первоначальный вопрос. Phill 422 - неправильный код состояния для использования, я предположил, что вы выполняете операцию записи. – ioseb

Смежные вопросы