【问题标题】:RESTful web services with complex actions (verbs)具有复杂操作(动词)的 RESTful Web 服务
【发布时间】:2012-05-21 02:17:40
【问题描述】:

我正在尝试构建一个后端是完整的 RESTful Web 服务的 Web 应用程序。 IE。模型(业务逻辑)将可以通过 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

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

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

    此外,构建服务的首选方法是将 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 的内容。这取决于您选择哪一个,但请记住,您应该使用GET 处理这些请求,无论您选择什么。 GET 不得更改资源,并且如果用户在历史记录中来回浏览,则不应产生副作用。否则,您可能会多次重新发送密码。请改用POST

    【讨论】:

    • 感谢您的回复安德斯。您是否认为最好首先使用典型的 MVC 方法构建我的应用程序(模型直接与数据库通信),然后再担心稍后制作 api.mysite.com?然后将修改模型以直接与 api 而不是数据库进行通信。对我的模型进行足够抽象以便在模型中不处理会话/身份验证可能是理想的,对吗?
    • @user1236971 我不是专家,但我是这样看的:单独开发模型听起来有点矛盾。您的模型应该以结构化的方式提供数据,尽可能多地隐藏底层实现。它还应该处理一些基本的安全性并隐藏不应该暴露的东西。例如,您应该能够更改或验证密码,但永远不要检索它(即使是作为哈希)。这或多或少正是 API 应该做的,你不应该重复你的代码。您的模型您的 API,尽管您可能会跳过 JSON 转换。
    • @user1236971 哦,顺便说一句,我不确定你对抽象模型的意思是什么,以便它们不处理身份验证。你打算在哪里做?我会尝试实现模型,以便视图或控制器中的错误永远无法破坏数据,这可能涉及进行一些权限检查。但就像我说的,会话管理很棘手,而且我不知道最佳实践。我遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多