Я разрабатывал веб-приложение, а затем остановился, чтобы подумать о том, как мой api должен быть спроектирован как веб-сервис RESTful. На данный момент большинство моих URI являются общими и могут применяться к различным веб-приложениям:
GET /logout // destroys session and redirects to /
GET /login // gets the webpage that has the login form
POST /login // authenticates credentials against database and either redirects home with a new session or redirects back to /login
GET /register // gets the webpage that has the registration form
POST /register // records the entered information into database as a new /user/xxx
GET /user/xxx // gets and renders current user data in a profile view
POST /user/xxx // updates new information about user
У меня такое чувство, что я делаю здесь много не так после того, как ковырялся в SO и Google.
Начнем с того, что /logout
, возможно, так как я на самом деле GET
ничего не имею - это может быть более подходящим для POST
запроса /logout
, уничтожить сеанс, а затем GET
перенаправить. И должен ли /logout
срок остаться?
Насчет /login
и /register
. Я мог бы перейти /register
на, /registration
но это не повлияет на фундаментальную работу моего сервиса - если у него есть более серьезные проблемы.
Теперь я замечаю, что никогда не раскрываю /user
ресурс. Возможно, это можно как-то использовать. Например, возьмем пользователя myUser
:
foo.com/user/myUser
или
foo.com/user
Конечному пользователю не требуется эта дополнительная многословность в URI. Однако какой из них визуально более привлекателен?
Я заметил несколько других вопросов здесь, в SO, об этом бизнесе REST, но я был бы очень признателен за некоторые рекомендации по тому, что я здесь изложил, если это возможно.
Спасибо!
ОБНОВИТЬ:
Мне также хотелось бы высказать свое мнение по поводу:
/user/1
против
/user/myUserName
Ответы:
Одна вещь особенно выделяется как не REST-ful: использование запроса GET для выхода из системы.
(из http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_methods )
Что касается выхода из системы и перенаправления, у вас может быть сообщение на ваш URI выхода из системы с перенаправлением ответа 303 на страницу после выхода.
http://en.wikipedia.org/wiki/Post/Redirect/Get
http://en.wikipedia.org/wiki/HTTP_303
Отредактируйте, чтобы решить проблемы с дизайном URL:
«Как мне разработать свои ресурсы?» для меня важный вопрос; "как мне создать свои URL-адреса?" рассматривается в двух областях:
URL-адреса, которые будут видеть пользователи, по возможности не должны быть слишком уродливыми и значимыми; Если вы хотите, чтобы файлы cookie отправлялись в запросах к одному ресурсу, но не к другим, вам нужно структурировать свои пути и пути файлов cookie.
Если
JRandomUser
вы хотите посмотреть свой профиль и хотите, чтобы URL-адрес был красивее, чемfoo.com/user/JRandomUser
илиfoo.com/user/(JRandom's numeric user id here)
, вы можете создать отдельный URL-адрес только для того, чтобы пользователь мог просматривать свою информацию:Я бы с большей готовностью заявил о незнании, чем о мудрости в этом вопросе, но вот несколько соображений по дизайну ресурсов:
источник
GET foo.com/profile/
), было бы это частью, как предлагал momo, уровня представления? Другими словами, что именно долженGET
вернуть этот запрос? Веб-страница или какой-нибудь JSON?GET
,POST
,PUT
иDELETE
ресурсов. Веб-сайт - это просто еще одна платформа, имеющая доступ к API. Другими словами, дизайн URL веб-сайта полностью отличается от дизайна RESTful API. Скажите, пожалуйста, если я все еще ошибаюсь, ха-ха.RESTful можно использовать в качестве руководства для создания URL-адресов, а также создавать сеансы и ресурсы пользователей :
GET /session/new
получает веб-страницу с формой входаPOST /session
аутентифицирует учетные данные по базе данныхDELETE /session
уничтожает сеанс и перенаправляет на /GET /users/new
получает веб-страницу с регистрационной формойPOST /users
записывает введенную информацию в базу данных как новый / user / xxxGET /users/xxx
// получает и отображает данные текущего пользователя в представлении профиляPOST /users/xxx
// обновляет новую информацию о пользователеОни могут быть во множественном или единственном числе (я не уверен, какой из них правильный). Я обычно использую
/users
для страницы индекса пользователя (как и ожидалось) и/sessions
для того, чтобы увидеть, кто вошел в систему (как и ожидалось).Использование имени в URL-адресе вместо числа (
/users/43
vs./users/joe
) обычно обусловлено желанием быть более дружелюбным к пользователям или поисковым системам, а не какими-либо техническими требованиями. Либо это нормально, но я рекомендую вам действовать последовательно.Я думаю, что если вы перейдете с регистрацией / входом / выходом из системы или
sign(in|up|out)
, это не будет работать с успокаивающей терминологией.источник
/new
кGET /session/
не RESTful? Я слышал, что глаголы обычно оставляют для глаголов HTTP (GET
,POST
и т. Д.).Сеансы не являются RESTful
Да, я знаю. Обычно это делается с помощью OAuth, но на самом деле сеансы не являются RESTful. У вас не должно быть ресурса / login / logout в первую очередь потому, что у вас не должно быть сеансов.
Если вы собираетесь это сделать, сделайте это RESTful. Ресурсы - это существительные, а / login и / logout - не существительные. Я бы пошел с / session. Это делает создание и удаление более естественным действием.
POST vs. GET для сессий - это просто. Если вы отправляете имя пользователя / пароль в виде переменных, я бы использовал POST, потому что я не хочу, чтобы пароль отправлялся как часть URI. Он появится в журналах и, возможно, будет виден через провод. Вы также рискуете получить сбой программного обеспечения из-за ограничений GET args.
Я обычно использую базовую аутентификацию или без аутентификации со службами REST.
Создание пользователей
Это один ресурс, поэтому вам не нужно / регистрироваться.
Какой тип ID использовать - сложный вопрос. Вы должны подумать об обеспечении уникальности, о повторном использовании старых идентификаторов, которые были УДАЛЕНЫ. Например, вы не хотите использовать эти идентификаторы в качестве внешних ключей на бэкэнде, если идентификаторы собираются повторно использовать (если это вообще возможно). Однако вы можете выполнить поиск преобразования внешнего / внутреннего идентификатора, чтобы снизить требования к бэкэнд.
источник
Я собираюсь просто рассказать о своем опыте интеграции различных веб-служб REST для моих клиентов, независимо от того, используется ли он для мобильных приложений или для связи между серверами, а также для создания REST API для других. Вот несколько наблюдений, которые я собрал из REST API других людей, а также из тех, которые мы создали сами:
Поскольку REST спроектированы как службы, такие функции, как вход в систему и выход из системы, обычно возвращают результат успеха / неудачи (обычно в формате данных JSON или XML), который затем интерпретирует потребитель. Такая интерпретация может включать перенаправление на соответствующую веб-страницу, как вы упомянули.
Это некоторые моменты из того, с чем я имел дело. Я надеюсь, что это может дать вам некоторое представление.
Что касается реализации вашего REST, это типичная реализация, с которой я столкнулся:
Выполнить выход из системы в серверной части и вернуть JSON для обозначения успеха / неудачи операции
Отправьте учетные данные на серверную часть. Вернуть успех / неудачу. В случае успеха обычно он также возвращает токен сеанса, а также информацию о профиле.
Подайте регистрацию на серверную часть. Вернуть успех / неудачу. В случае успеха обычно рассматривается как успешный вход в систему, или вы можете выбрать регистрацию как отдельную услугу.
Получить профиль пользователя и вернуть формат данных JSON для профиля пользователя
Опубликуйте обновленную информацию профиля в формате JSON и обновите информацию в серверной части. Вернуть успех / неудачу вызывающему
источник
Я считаю, что это подход к аутентификации RESTful. Для входа в систему вы используете
HttpPut
. Этот HTTP-метод можно использовать для создания, если предоставлен ключ и повторные вызовы идемпотентны. Для выхода из системы вы указываете тот же путь вHttpDelete
методе. Глаголы не используются. Правильное плюрализация коллекции. Методы HTTP поддерживают эту цель.При желании вы можете заменить текущий на активный.
источник
Я бы порекомендовал использовать URL-адрес учетной записи пользователя, аналогичный Twitter, где URL-адрес учетной записи пользователя будет примерно таким,
foo.com/myUserName
как если бы вы могли перейти в мою учетную запись Twitter с URL-адресом https://twitter.com/joelbylerЯ не согласен с тем, что для выхода из системы требуется POST. В рамках вашего API, если вы собираетесь поддерживать сеанс, то идентификатор сеанса в форме UUID может быть чем-то, что можно использовать для отслеживания пользователя и подтверждения того, что выполняемое действие авторизовано. Тогда даже GET может передать идентификатор сеанса ресурсу.
Короче говоря, я бы порекомендовал вам оставаться простым, URL-адреса должны быть короткими и запоминающимися.
источник