Вы, в свою очередь, спрашиваете «лучший», «правильный путь» и «правильный», что затрудняет ответ на этот вопрос, поскольку эти критерии не обязательно являются взаимозаменяемыми и могут фактически конфликтовать, особенно еслиRESTfulness касается.
«Лучший» ответ зависит от вашей заявки.Вы создаете веб-приложение на основе простого старого браузера (POBB)?Вы создаете собственный клиент (например, iOS или Android) и запускаете сервис через Интернет?Вы интенсивно используете AJAX для обновления веб-страниц?Является ли curl предполагаемым клиентом?
Предположим, вы создаете традиционное веб-приложение.Давайте посмотрим, как Google это делает (выходные данные прерваны для краткости):
$ curl -v http://gmail.com/
< HTTP/1.1 301 Moved Permanently
< Location: http://mail.google.com/mail/
< Content-Type: text/html; charset=UTF-8
< Content-Length: 225
< ...
Google сначала перенаправляет нас на «истинный» URL для GMail (используя перенаправление 302).
$ curl -v http://mail.google.com/mail/
< HTTP/1.1 302 Moved Temporarily
< Location: https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=http://mail.google.com/mail/&scc=1<mpl=default<mplcache=2
< Content-Type: text/html; charset=UTF-8
< Content-Length: 352
< ...
И затем он перенаправляет нас на страницу входа (используя перенаправление 302.)
$ curl -v 'https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=http://mail.google.com/mail/&scc=1<mpl=default<mplcache=2'
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< ...
Сама страница входа поставляется с кодом состояния 200 !
Почему так?
С точки зрения пользовательского опыта, если пользователь переходит на страницу, которую он не может просмотреть, потому что он не аутентифицирован, вы хотите перевести пользователя на страницу, которая позволяет ему исправить это.(через вход в систему).В этом примере страница входа в систему стоит отдельно и является просто другой страницей (именно поэтому 200 подходит).
Вы можете открыть страницу 4XX с объяснением и ссылкой на страницу входа.Это может на самом деле казаться более RESTful.Но это хуже для пользователя.
Хорошо, но есть ли случай, когда что-то вроде 403 имеет смысл?Абсолютно.
Во-первых, обратите внимание, что 403 не является четко определенным в спецификации.Чтобы понять, как это следует использовать, вам нужно посмотреть, как это реализовано в полевых условиях.
403 обычно используется веб-серверами, такими как Apache и IIS, в качестве кода состояния для страниц, возвращаемых по запросу браузерасписок каталогов (URI заканчивается на «/»), но на сервере списки каталогов отключены.В этом случае 403 действительно является специализированным 404, и вы мало что можете сделать для пользователя, кроме как сообщить ему / ей, что пошло не так.
Однако, вот пример сайта, который использует403 оба сигнализируют пользователю, что он / она не имеет достаточных привилегий и , какие действия необходимо предпринять для исправления ситуации (подробности см. В полном ответе ):
curl -v http://www.w3.org/Protocols/rfc2616/
< HTTP/1.1 403 Forbidden
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 1564
< ...
(Кроме того, 403 также встречается в веб-API, таких как API Twitter; здесь 403 означает «запрос понят, но он был отклонен. В сопроводительном сообщении об ошибке будет объяснено, почему».Этот код используется, когда запросы отклоняются из-за ограничений на обновление. ")
В качестве улучшения давайте предположим, однако, что вы не хотите перенаправлять пользователя на логинили заставьте пользователя перейти по ссылке на страницу входа.Вместо этого вы хотите отобразить форму входа на странице, которую пользователь не видит.Если они успешно аутентифицируются, они видят контент при перезагрузке страницы;если они терпят неудачу, они получают форму входа снова.Они никогда не переходят на другой URL.
В этом случае код состояния 403 имеет большой смысл и гомологичен случаю 401 с оговоркой, что браузер не будет отображать диалоговое окно с запросомпользователь для аутентификации - форма находится на самой странице.
Этот подход к аутентификации не распространен, но он может иметь смысл, и IMHO предпочтительнее pop-up-a-javascript-modal-решения для входа в систему, которые разработчики пытаются реализовать.
Вопрос сводится к вопросу, хотите ли вы перенаправить или нет?
Дополнительно: мысли о401 код состояния ...
Код состояния 401 - и связанная с ним базовая / дайджест-аутентификация - имеют много преимуществ. Он поддерживается спецификацией HTTP, поддерживается всеми крупными браузерами, по сути он не является RESTful ... Проблема в том, что с точки зрения пользовательского опыта это очень и очень непривлекательно. Это непростое, загадочное всплывающее диалоговое окно, отсутствие элегантного решения для выхода из системы и т. Д. Если вы (или ваши заинтересованные стороны / клиенты) можете смириться с этими проблемами (большое «если»), то его можно квалифицировать как «правильный». Решение.