5

我认为我对 RESTful 架构的原则有很好的把握,但我还没有做到。

我似乎无法弄清楚的部分是客户端如何知道每个资源可以使用哪些 HTTP 方法?当应用程序流程中需要特定操作来继续流程时,该怎么办?

简化示例:

假设客户向我的 REST API 下一个简单的订单。

客户端将向:http ://api.mycompany.com/orders 发出 post 请求

请求有效载荷

<order>
    <items>
        <sku>12345</sku>
        <quantity>1</quantity>
    </items>
</order>

假设请求成功

响应负载

<order>
    <id>156</id>
    <status>Pending Payment</status>
    <items>
        <sku>12345</sku>
        <quantity>1</quantity>
    </items>    
    <links>
        <link rel="order" url="http://api.mycompany.com/orders/156" />
        <link rel="invoice" url="http://api.mycompany.com/payments/156" />
        <link rel="payment" url="http://api.mycompany.com/invoices/156" />
    </links>
</order>

如果我正确理解了超媒体约束,我会提供相应的资源,客户可以选择从那里去哪里。

在上面的示例中,带有 rel="order" 的链接可以是GETPUTDELETE请求。rel="invoice" 的链接仅限于GET请求。rel="payment" 的链接只接受POST请求。

客户怎么知道这个?我知道如果他们向上述资源之一发出OPTIONS请求,它应该为他们提供可用的方法,但我不确定这是否是处理这种情况的标准方法。

任何帮助将不胜感激。

4

2 回答 2

6

一个简单的事实是,这些动词将记录在资源文档中。

您没有问的问题是,“客户如何知道参考‘订单’、‘发票’和‘付款’的用途?”。

然而,他们遇到了同样的问题。他们也需要记录在案。

当这些被记录时,当这些 rels 被解释为它们是什么、它们为什么存在以及作为资源使用者将它们用于什么时,那么利用这些资源所必需的实际动词也将与它们一起记录。

于 2011-06-02T20:11:41.443 回答
0

客户端可以在您公开的任何 URI 上调用任何 HTTP 动词。这些行动是否会产生任何影响是一个单独的问题。

客户端可以通过不同的方式发现哪些方法可以在特定的 URI 上工作:

  1. 他们用不同的动作调用每个 URI,并动态地找出哪些有效(返回 2xx 响应代码)和哪些返回405 - Method Not Allowed
  2. 客户端程序员会提前阅读您的文档并编写交互代码。

老实说,我从未见过在生产系统中实施#1。#2 对我和大多数必须编写使用 REST API 的客户端的人来说是最有意义的。

请注意,使用 REST API 不仅仅是知道要使用哪个 HTTP 动词。媒体类型的内容和结构(对于请求和响应)对于记录并提供给计划针对您的系统进行编码的人同样重要。

于 2011-06-02T20:18:39.837 回答