Стандарт REST для GET для ресурса, который не существует - PullRequest
6 голосов
/ 07 октября 2009

Ресурс / пользователь / 12345 не существует. Допустим, потребитель случайно выбирает разные идентификаторы. Там нет авторизации. Любой пользователь может просматривать любого пользователя. В более широком смысле мой вопрос: «Что вы должны вернуть, если выполняете GET для несуществующего ресурса?»

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

Какова типичная / обычная / рекомендуемая практика?

Ответы [ 9 ]

21 голосов
/ 07 октября 2009

Возврат 404 кода состояния.

11 голосов
/ 07 октября 2009

Это немного зависит от ваших проблем с безопасностью. Я бы либо отправил 404, если все в порядке, что гадатель узнает, если этот идентификатор пользователя не существует, либо отправил 401 для всех попыток доступа без аутентификации к любому ресурсу в / user

6 голосов
/ 07 октября 2009

404

Тем не менее, предполагается, что вы впервые проверили авторизацию для этой операции -> / user / [id], и если пользователю не разрешен доступ к учетным записям других пользователей, вы вернете 401 .

Никогда не полагайтесь на пользователя, не знающего идентификаторы пользователя ...

5 голосов
/ 07 октября 2009

@ Байрон прав, верните HTTP 404. Вы хотите использовать все возможности HTTP, включая коды состояния ответа. Поэтому, если есть ошибка клиента, верните код ошибки 4xx, а если код вашего сервера имеет внутреннюю проблему, верните код ошибки 5xx и т. Д.

Ричардсон и Руби RESTful Web Services (О'Рейли) подробно обсуждают это и приложение со всеми наиболее важными кодами ошибок HTTP и временем их использования.

2 голосов
/ 07 октября 2009

Если пользователь аутентифицирован и авторизован, верните 404. Если пользователь не аутентифицирован и не авторизован, отправьте его на страницу для авторизации.

1 голос
/ 07 октября 2009

Для меня это похоже на ошибку 404. Ресурс не найден.

1 голос
/ 07 октября 2009

GET должен извлекать только то, что существует.

Так что я бы вернул 404.

0 голосов
/ 28 декабря 2012

Мое мнение: верните пустую 200.

Откровенно говоря, если ресурс REST не существует, он не существует. Это означает возврат 404. Однако в вашем случае 12345 - это параметр, который вы используете для идентификации / поиска возвращаемой сущности. Ресурс / пользователь / {userId} действительно существует, поэтому технически я не верю, что было бы целесообразно возвращать 404, хотя ясно видеть аргумент для любой из сторон.

Если вы чувствуете, что возвращение двух кодов состояния каким-то образом выставляет вашу систему, я бы сказал, что придерживайтесь пустого 200 OK.

0 голосов
/ 01 ноября 2009

Исходя из вашего исходного вопроса, без авторизации, это явно 404. Если бы вы добавили авторизацию, тогда было бы приемлемо вернуть 404 для всех неавторизованных запросов; это предотвращает случайное угадывание идентификатора, отличая 401 или 403 (существует, но не авторизован) от 404 (не существует), как предполагают некоторые другие ответы. Согласно RFC :

10.4.5 404 Not Found ... Этот код состояния обычно используется, когда сервер не хочет раскрывать, почему именно запрос был отклонен, или когда другие ответы не применимы.

...