具有复杂操作(动词)的RESTful Web服务

时间:2012-05-13 03:18:33

标签: asp.net-mvc asp.net-mvc-4 rest rpc

我正在尝试构建一个Web应用程序,其中后端是一个完整的RESTful Web服务。即模型(业务逻辑)可以通过HTTP完全访问。例如:

GET    /api/users/
GET    /api/users/1
POST   /api/users
PUT    /api/users/1
DELETE /api/users/1

提供更多不是CRUD(动词/动作)的方法的正确方法是什么?这被认为更像是RPC-api域吗?如何正确设计RPC api以在RESTful api之上运行?

例如,我如何优雅地为用户实现忘记密码方法。

POST (?) /api/users/1/forgot

然后,应用程序(Controllers / View)将使用https请求(类似HMVC)来访问模型和方法。身份验证的最佳选择是什么? OAuth,基于HTTP的基本身份验证吗?

虽然这是后来可扩展性的“最佳实践”,但我是否过度设计此任务?是否最好只遵循典型的MVC模型并提供非常基本的API?

这个问题主要受到ASP.NET的MVC 4(WebAPI)和NodeJS模块https://github.com/marak/webservice.js的启发

提前致谢

1 个答案:

答案 0 :(得分:0)

我最近开始学习REST,在开发新的Web服务时,我认为你正在考虑它。

你对自定义动词的假设是正确的。 REST承认某些操作需要以不同的方式处理,而自定义动词不违反要求。在与服务器通信时应使用POST,但动词通常用imperative编写。而不是忘记,我可能会使用提醒或类似的东西。即,您应该说明要做什么,而不是描述发生的事情而不清楚地表明您期望的结果。

此外,构建服务的首选方法是将 api 包含在域名中,并将其从路径中删除。我会写这样一个特定的例子:

POST /users/1/remind HTTP/1.1
Host: api.myservice.example.com

REST中的会话处理有点棘手。最干净的方法可能是使用基本访问身份验证在每个请求上使用用户名和密码进行身份验证。但是,我相信很少这样做。你应该阅读这个问题(及其接受的答案):OAuth's tokens and sessions in REST

编辑:我还会在您的示例中删除GET请求中的尾随正斜杠。如果该服务真的是RESTful,则该资源不应该是/users//users的可访问资源。特定资源应该只有一个指向它的URL。带有斜杠的URL实际上与没有斜杠的URL不同。 REST促进删除它,并且RESTful Web服务不应该同时接受(在GET的情况下意味着以200 OK响应),尽管它可以从一个重定向到另一个。否则,它可能会导致混淆正确的URL,重复缓存,哭泣和咬牙切齿。 :)

编辑2:在Richardson&amp ;;的 RESTful Web Services 中Ruby,你不鼓励将新动词放在路径中。相反,您可以附加?_method=remind之类的内容。这取决于您选择的是哪一个,但请记住您 应该使用GET处理这些请求,而不管您选择的是什么。 GET不得更改资源,如果用户在历史记录中来回浏览,则不应导致副作用。否则,您可能会多次重新发送密码。请改用POST