RESTful Web服务:方法名称、输入参数和返回值?

RESTful Web服务:方法名称、输入参数和返回值?,rest,restful-authentication,Rest,Restful Authentication,我正在尝试开发一个简单的RESTAPI。我仍在努力理解它的基本架构范例。我需要以下方面的帮助: “资源”应该是名词,对吗?所以,我应该有“user”,而不是“getUser”,对吗 我在一些API中见过这种方法:www.domain.com/users/(返回列表),www.domain.com/users/user(做一些特定于用户的事情)。这个方法好吗 在我看到的大多数示例中,输入和输出值通常只是名称/值对(例如color='red')。如果我想发送或返回比这更复杂的东西呢?我是否被迫只处理

我正在尝试开发一个简单的RESTAPI。我仍在努力理解它的基本架构范例。我需要以下方面的帮助:

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

  • 我在一些API中见过这种方法:www.domain.com/users/(返回列表),www.domain.com/users/user(做一些特定于用户的事情)。这个方法好吗

  • 在我看到的大多数示例中,输入和输出值通常只是名称/值对(例如color='red')。如果我想发送或返回比这更复杂的东西呢?我是否被迫只处理XML

  • 假设使用PUT to/user/方法向系统添加新用户。输入参数的好格式是什么(假设只需要“用户名”和“密码”)字段?如果用户成功,什么是好的响应?如果用户失败了(我想返回一条描述性错误消息),该怎么办

  • 什么是一种好的、简单的身份验证和授权方法?我想将大多数方法限制为已成功“登录”的用户。每次通话时传递用户名/密码可以吗?传递令牌是否被认为是更安全的(如果是,在过期等方面应该如何实现)


  • 关于第1点,是的。名词是预期的

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

    对于第3点,您可以返回任何内容。你的客户可以指定它想要什么。e、 g.
    text/xml
    application/json
    等。通过使用HTTP请求头,您应该尽可能地遵守该请求(尽管您可能只处理,比如说,
    text/xml
    ,这在很多情况下都是合理的)


    对于第4点,我希望
    POST
    创建一个新用户
    PUT
    将更新现有对象。要报告成功或错误,应使用现有的HTTP成功/错误代码。e、 g.
    200正常
    。有关更多信息,请参阅。

    REST最重要的约束是超媒体约束(“作为应用程序状态引擎的超文本”)。将您的Web应用程序视为一个状态机,在该状态机中,客户端可以请求每个状态(例如GET/user/1)。一旦客户端有一个这样的状态(想想:用户正在查看网页),它就会看到一组链接,可以跟随这些链接进入应用程序中的下一个状态。例如,可能有一个来自“用户状态”的链接,客户机可以按照该链接转到详细信息状态

    这样,服务器在运行时一次向客户机呈现应用程序的状态机一个状态。聪明的做法是:由于状态机是在运行时一次在状态上发现的,因此服务器可以在运行时动态更改状态机

    话虽如此

    一号。这些资源本质上代表了要呈现给客户机的应用程序状态。通常会与域对象(例如用户)紧密匹配,但请确保您了解,为它们提供的表示形式不仅仅是序列化的域对象,而是Web应用程序的状态

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

    二号。正如布赖恩所说。您可能想看看Atom发布协议RFC(5023),因为它很好地解释了创建/读取/更新周期

    3号。关注面向文档的消息。媒体类型是REST的重要组成部分,因为它们(完全)提供了应用程序语义。不要使用诸如application/xml或application/json之类的泛型类型,因为您将围绕通常隐式的模式耦合客户端和服务器。如果没有什么适合你的需要,那就做你自己的类型

    也许您对我正在使用UBL一起破解的一个示例感兴趣:

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

    五号。由于不能使用会话(有状态服务器)和RESTful,所以必须在每个请求中发送凭据。各种HTTP身份验证方案已经处理了这个问题。这对于缓存也很重要,因为HTTP授权头对缓存具有特殊的指定语义(没有公共缓存)。如果你把你的证书塞进饼干里,你就失去了那块重要的东西

    所有HTTP状态代码都有特定的应用程序语义。使用它们,不要通过HTTP来挖掘自己的错误语义

    您可以访问#rest IRC或加入雅虎上的rest讨论以获得详细讨论


    Jan

    您能详细介绍一下泛型类型吗?text/xml本身并没有指定模式,所以我对您的评论感到有点困惑。第3点。这里有一个很好的例子,媒体类型告诉HTTP消息的接收者消息的语义是什么。泛型类型对于应用程序没有任何有用的语义。如果您收到一条application/xml消息,您基本上只知道可以将其塞进xml解析器,仅此而已。如果目的是发送订单,收件人必须能够从媒体类型中理解这一点。如果发送泛型类型和客户端与服务器依赖的XML具有某种形式,则客户端与服务器通过带外语义耦合。此外,该消息不是自我描述的。更好?是的。我知道你是从哪里来的。因此,在具有大型域模型的应用程序中,您会推荐多种类型,例如应用程序/用户、应用程序/交易等吗?这取决于您可以重用的现有媒体类型以及域本身(IMHO,媒体类型设计仍然是一个有待研究的领域,罗伊·菲尔丁(Roy Fielding)没有把这一章放在他的论文中,因为正如他所说,h