Рестлет нескольких действий на одну сущность - PullRequest
1 голос
/ 14 августа 2010

Я пытаюсь выяснить, как наилучшим образом выложить набор API Restlet. У меня есть сущность User, которая может иметь стандартные операции 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}

И код обработки может выглядеть так (псевдо):

action = request.getAttributes().get("actionType");
if (action == "update") {
   do update
} elif (action == "resetpassword") {
   do resetpassword
} elif (action == "terminate") {
   do terminate
}

Действительно плохая идея? Неужели идея ниндзя?

Ответы [ 2 ]

1 голос
/ 14 августа 2010

Как насчет этого?

PUT /user/bob 
DELETE /user/bob/password 
DELETE /user/bob 

и не забывайте, что могги заявляют, что клиент должен обнаружить эти URL-адреса из какого-то другого документа, он не должен знать их заранее.

1 голос
/ 14 августа 2010

Я думаю, что это хорошая идея. Если вы хотите, чтобы ваше приложение было RESTful, вам действительно нужно предоставить ссылки в представлении для вашего ресурса пользователя и задокументировать их как URI, которые выполняют выбранные действия.

Sun Cloud API делает именно это :

  • GET VM возвращает виртуальную машину представления, включающую «контроллеры», которые являются URI, выполняющими функции (см. описание типа носителя VM )
  • Клиент знает о типе носителя, распознает контроллеры (например, виртуальная машина обеспечивает «запуск», «останов» и т. Д.)
  • URI ресурса управления для этой конкретной виртуальной машины прямо здесь

Итак, как вы можете видеть, если вы используете /1.0/user/resetPassword или /1.0/user?op=resetPassword или /1.0/resetPassword?userId=xyzzy, то это немного неактуально, поскольку клиент на самом деле не должен заботиться, он просто следует ссылкам в представлениях.

Кроме того, не забывайте использовать POST для таких операций, поскольку они, как правило, не являются идемпотентными и, вероятно, имеют побочные эффекты.

...