4

我正在尝试构建一个 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

然后应用程序(控制器/视图)将使用 https 请求(类似 HMVC)来访问模型和方法。什么是最好的身份验证?OAuth,基于 HTTP 的基本身份验证?

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

这个问题的灵感主要来自 ASP.NET 的 MVC 4 (WebAPI) 和 NodeJS 模块https://github.com/marak/webservice.js

提前致谢

4

1 回答 1

1

我最近开始学习 REST,在开发新的 Web 服务时,我认为您正在做正确的事情来考虑它。

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

此外,构建服务的首选方法是将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 & Ruby 的RESTful Web Services中,不鼓励您将新动词放在路径中。相反,您可以附加类似?_method=remind. 这取决于您选择哪一个,但请记住,无论您选择什么,您都不应该使用 来处理这些请求。A不得更改资源,并且如果用户在历史记录中来回浏览,则不应产生副作用。否则,您可能会多次重新发送密码。改为使用。GETGETPOST

于 2012-05-20T07:45:39.363 回答