Прежде чем углубиться в REST, вот несколько терминов, которые вам действительно нужно понять:
Ресурс - вещи / данные, которые вы хотите сделать доступными в вашем API (в вашем случае «Пользователь»)
URI - универсальный уникальный идентификатор для ресурса . Не должно упоминать ничего о выполняемом методе (например, не должно содержать «добавить» или «удалить»). Однако структура вашего URI не делает ваше приложение более или менее RESTful - это распространенное заблуждение.
Uniform Interface - фиксированный набор операций , которые вы можете выполнять на своих ресурсах, в большинстве случаев это HTTP . Есть четкие определения для целей каждого из этих методов HTTP.
Самая неприятная вещь о ваших URI, какими они сейчас являются, заключается в том, что они имеют информацию о выполняемой операции прямо в них. URI - это идентификаторы и ничего более!
Давайте рассмотрим пример из реального мира. Меня зовут Натан. «Натан» может считаться моим идентификатором (или, в спокойном смысле, URI - для целей этого примера предположим, что я единственный «Натан»). Мое имя / ID не меняются в зависимости от того, как вы хотите со мной взаимодействовать, например, Мое имя не изменится на «NathanSayHello», когда ты захочешь меня приветствовать.
То же самое для отдыха. Ваш пользователь, обозначенный http://api.domain.com/users/1, не изменится на http://api.domain.com/users/1/update.xml, если вы хотите обновить этого пользователя. Тот факт, что вы хотите обновить этого пользователя, подразумевается методом, который вы используете (например, PUT).
Вот мое предложение для ваших URI
# Retrieve info about a user
GET http://api.domain.com/user/<id>
# Retrieve set all users
GET http://api.domain.com/users
# Update the user IDed by api.domain.com/user/<id>
PUT http://api.domain.com/user/<id>
# Create a new user. The details (even <id>) are based as the body of the request
POST http://api.domain.com/users
# Delete the user ID'd by api.domain.com/user/<id>
DELETE http://api.domain.com/user/<id>
Что касается ваших вопросов:
Используйте при необходимости PUT и DELETE и избегайте перегрузки POST для обработки этих функций, поскольку это нарушает HTTP-определение POST . HTTP ваш единый интерфейс. Это ваш контракт с пользователем API о том, как они могут ожидать взаимодействия с вашим сервисом. Если вы нарушаете HTTP, вы нарушаете этот контракт.
Удалить "добавить" в целом. Используйте заголовок HTTP Content-Type для указания типа mime публикуемых данных.
Вы имеете в виду версию своего API или версию ресурса? ETag и другие заголовки ответа могут использоваться для версий ресурсов.
Здесь много вариантов. Базовая HTTP-аутентификация (простая, но небезопасная), Digest Auth, настраиваемая аутентификация, такая как AWS. OAuth также возможен. Если безопасность имеет первостепенное значение, я использую клиентские SSL-сертификаты.