Если маршрут не был реализован на сервере, должен ли он возвращать 404 или 501? - PullRequest
0 голосов
/ 18 февраля 2020

Я всегда возвращал 404, когда какой-то маршрут не был реализован и ресурс не существует. Например, если у меня есть API, который возвращает людей на /api/people, если я попытаюсь get объект на /api/animals, я собираюсь вернуть 404.

Мой коллега сказал 404 только для не найденных ресурсов, например, если я пытаюсь get /api/people/100, но нет людей с идентификатором 100. Для /api/animals он вернет 501.

Для меня значение 501: когда у меня есть маршрут, который не поддерживает один из методов, например, если я могу get /api/people/3, но не могу delete его.

Я решил взглянуть на спецификацию :

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


501 ( Не реализовано) код состояния указывает, что сервер не поддерживает функциональность, необходимую для выполнения запроса . Это правильный ответ, когда сервер не распознает метод запроса и не способен поддерживать его для какого-либо ресурса.

Мне кажется, что спецификация немного двусмысленна , В то же время можно утверждать, что /api/animals не был найден сервером происхождения (404), также верно, что сервер происхождения не реализовал метод для полного выполнения запроса (501).

В этом случай, какой самый правильный код статуса для возврата?

1 Ответ

1 голос
/ 18 февраля 2020

Если бы вы зашли в книжный магазин и попросили человека за прилавком достать «Лучшие 100 тортов» с полки, а книги не было в наличии, они вернулись бы и вежливо сказали бы: «Извините, я могу» найти эту книгу ". Автоматизируйте это в системе поиска книг, и она выдаст 404.

Менеджер книжного магазина не появится, вместо того, чтобы искать вашу книгу и сказать вам: «Боюсь, мы не поддерживаем искать эту конкретную книгу, поскольку наши сотрудники могут искать только те книги, которые у нас есть "(501).

Если вы зайдете в книжный магазин и попросите человека за прилавком достать вам газонокосилку, они вежливо ответят:" Я извините, я не знаю, как это сделать ". Это будет 501. Если бы вы попросили человека в книжном магазине избавиться от книги, которую вы только что видели на полке, это тоже было бы 501.

А 404 - это «хорошо, Я знаю, как это получить, но его там нет ". 501 - это «WTF! Что вы думаете об этом месте?».

Постоянный ли 404, зависит от того, что отвечает на вопрос. Если это API REST, он может вернуть статус JSON, говорящий о том, что что-то вроде книги отсутствует, но находится в заказе, с вероятной датой истечения.

Реальная причина - 501 при попытке получить Книжный человек, чтобы выкинуть книгу, которую они имеют на полке, если бы они просто сказали 404, вы бы просто сказали: «Вот оно!». Им нужно будет указать истинную причину, по которой они не могли этого сделать. У них нет бизнес-политики, которая позволяет им выбрасывать случайные книги, не покупая их.

Таким образом, технически аппарат есть, они могут подойти к книге, взять ее, но остановиться на 501 в качестве политики не был реализован.

"хорошо, я знаю, как превратить URL-адрес REST в функциональность, вот откуда я знаю, какую функциональность вы хотите, но эй, мы имеем дело только с людьми, 501".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...