Я пытаюсь выяснить, как лучше всего разметить ряд API Restlet. У меня есть Пользовательский объект, который мог бы начать стандартные операции CRUD, который соответствует приятно отдыху, но существуют другие также как "измененный пароль", или "оконечные".
Что лучший способ состоит в том, чтобы разметить это?
Вот то, что я думал:
/1.0/user/update //perhaps this would just be a PUT on /1.0/user
/1.0/user/resetPassword //This would reset the password, but also send an email.
/1.0/user/terminate //This might do some additional cleanup
Затем я сделал бы UserResource, который действительно присоединит как это
/1.0/user/{actionType}
И код обработки мог бы быть похожим на этот (psuedo):
action = request.getAttributes().get("actionType");
if (action == "update") {
do update
} elif (action == "resetpassword") {
do resetpassword
} elif (action == "terminate") {
do terminate
}
Действительно плохая идея? Действительно идея ниндзя?
Думаю, это нормальная идея. Если вы хотите, чтобы ваше приложение было RESTful, вам действительно нужно предоставить ссылки в представлении для вашего ресурса User и задокументировать их как URI, которые выполняют выбранные действия.
Sun Cloud API делает именно это :
Итак, как вы можете видеть , если вы используете /1.0/user/resetPassword
или /1.0/user?op=resetPassword
или /1.0/resetPassword?userId=xyzzy
, это немного неактуально , поскольку клиент на самом деле не должен заботиться о нем, он просто следует по ссылкам в представлениях.
Кроме того, не забудьте использовать POST для таких операций, поскольку они обычно не идемпотентны и, вероятно, имеют побочные эффекты.
А как насчет этих?
PUT /user/bob
DELETE /user/bob/password
DELETE /user/bob
и не забывайте, что Могси сказал, что клиент должен обнаруживать эти URL-адреса из какого-то другого документа, он не должен знать их заранее.