REST风格的Web服务:方法名称,输入参数和返回值?

我正在尝试开发一个简单的REST API。 我仍然试图了解它的基本架构范例。 我需要以下方面的帮助:

  • “资源”应该是名词,对吗? 所以,我应该有“用户”,而不是“getUser”,对吗?

  • 我在一些API中看到了这种方法:www.domain.com/users/(返回列表),www.domain.com/users/user(针对用户执行某些操作)。 这种方法好吗?

  • 在我见过的大多数例子中,输入和输出值通常只是名称/值对(例如color ='red')。 如果我想发送或退回比这更复杂的东西,该怎么办? 我是不是只能处理XML?

  • 假设用户/用户/方法将一个新用户添加到系统中。 什么是输入参数的好格式(假设所需的唯一字段是'用户名'和'密码')? 如果用户成功,那么这将是一个很好的回应? 如果用户失败(我想返回一条描述性错误信息)会怎么样?

  • 什么是认证和授权的好方法? 我想限制大部分方法成功登录的用户。 每次通话都传递用户名/密码好吗? 是否传递一个被认为更安全的令牌(如果是的话,应该如何实现过期等)?


  • 对于第1点,是的。 名词预计。

    对于第2点,我希望/users给我一个用户列表。 我期望/users/123给我一个特定的用户。

    对于第3点,你可以返回任何东西。 你的客户可以指定它想要的。 例如text/xmlapplication/json等,通过使用HTTP请求头文件,你应该尽可能地遵守该请求(尽管你只能处理text/xml这在很多情况下都是合理的)的情况下)。

    对于第4点,我希望POST创建一个新用户。 PUT会更新现有的对象。 要报告成功或错误,您应该使用现有的HTTP成功/错误代码。 例如200 OK 。 有关更多信息,请参阅此答案。


    REST最重要的约束是超媒体约束(“超文本作为应用程序状态的引擎”)。 把你的Web应用程序想象成一个状态机,其中每个状态都可以被客户端请求(例如GET / user/1)。一旦客户端有一个这样的状态(想想:一个用户在看网页),它看到一堆它可以遵循的链接转到应用程序中的下一个状态。 例如,可能存在来自“用户状态”的客户端可以遵循的链接以进入详细状态。

    这样,服务器在运行时一次向客户端呈现应用程序的状态机一次。 巧妙的是:由于状态机在运行时一直处于状态,因此服务器可以在运行时动态更改状态机。

    话说回来...

    在1.资源基本上代表你想要呈现给客户端的应用程序状态。 通常会与域对象(例如用户)密切配合,但要确保您了解您为其提供的表示不仅仅是序列化的域对象,而是Web应用程序的状态。

    根据GET / users / 123进行思考很好。 不要在URI中放置任何操作。 虽然没有害处(它只是一个不透明的字符串),但至少可以说是令人困惑的。

    2.如Brian所说。 您可能需要查看Atom发布协议RFC(5023),因为它很好地解释了创建/读取/更新周期。

    关注3.面向文档的消息。 媒体类型是REST的重要组成部分,因为它们提供了应用程序语义(完全)。 不要使用泛型类型,例如application / xml或application / json,因为您会将客户端和服务器耦合到通常隐式的模式中。 如果没有任何东西符合您的需求,只需制作您自己的类型。

    也许你对我使用UBL黑客攻击的例子感兴趣:http://www.nordsc.com/blog/?cat = 13

    通常,使用POST / users /进行创建。 看看RFC 5023 - 这将澄清这一点。 这是一个容易理解的规范。

    因为你不能使用会话(有状态服务器)并且是RESTful的,所以你必须在每个请求中发送证书。 各种HTTP认证方案已经处理了。 关于缓存也很重要,因为HTTP授权标头具有特殊的指定语义缓存(无公共缓存)。 如果你把你的凭证塞入cookie中,你会丢掉那个重要的部分。

    所有的HTTP状态码都有一定的应用语义。 使用它们,不要通过HTTP隧道自己的错误语义。

    您可以访问#rest IRC或参加雅虎休息讨论以进行详细讨论。

    一月

    链接地址: http://www.djcxy.com/p/45321.html

    上一篇: RESTful Web Services: method names, input parameters, and return values?

    下一篇: Best way to return error messages on REST services?