Как различить 404 между сущностью не существует и неверной конечной точкой? - PullRequest
10 голосов
/ 04 июня 2010

Используя принципы REST, 404, кажется, используется, чтобы указать, что объект не существует. Тем не менее, как клиенты могут отличить этот случай от использования неверной конечной точки в целом?

Я хочу провести различие между «вы пришли к правильной конечной точке, но эта сущность не существует» и «вы не находитесь на правильной конечной точке». Технически это можно различить с помощью других кодов ответов, пользовательских заголовков и т. Д., Но я в основном заинтересован в лучших практиках REST в этой области, поэтому клиенты максимально просты и стандартны.

Ответы [ 3 ]

3 голосов
/ 05 июня 2010

вы пришли к правильной конечной точке, но эта сущность не существует

Если по URL-адресу нет ресурса, как это может быть правильной конечной точкой?Единственный возможный сценарий, о котором я мог подумать, это то, что объект был удален, и в этом случае 410 Gone является правильным ответом.

Помните, что если вы следуете принципам RESTful, то URL должен быть предоставлен сервероми если да, то почему сервер раздает неверные URL-адреса?

2 голосов
/ 04 июня 2010

Я считаю, что определение правильной конечной точки является исключительной ответственностью клиента REST. (Конечно, служба разрешения конечной точки может быть легко реализована.) Ошибка 404 означает, что эта конкретная конечная точка не содержит эту конкретную сущность.

Ничто в дизайне RESTful не требует от сервера знать, взаимодействует ли клиент с "правильным" хостом.

1 голос
/ 04 июня 2010

Предполагая, что структура выложена так:

/ -- root
|____+
     /object
     |____+
          /members
          |____+
               /attributes
               |____+
                    /attribute_1
                    /attribute_2
                    ...
                    /attribute_n


Если вы имеете в виду, что вы хотите быть в состоянии отличить кого-то от удара
/object/members/attributes/incorrect_attribute
(a 404 с использованием всех правильных команд, но попытка получить несуществующий ресурс)
и кто-то ударил /object/members/big-bird
(Предполагая, что members не может быть действительной конечной точкой самостоятельно
[и что /object/members/attributes также не является действительной конечной точкой])
тогда я считаю, что вы можете вернуть либо ошибку 501 (не реализовано), либо ошибку 403 (запрещено), в зависимости от того, где вы хотите поместить вину. (С другой стороны, 418 (я чайник) также действует здесь).

EDIT:
Наконец, если attribute_n использовал для существования и больше не существует, вы можете ответить 410 (ресурс пропал).

См .: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

...