从具有超媒体约束的REST API提供响应时,如何向客户端指示要使用哪种HTTP方法(动词)?

时间:2011-06-02 19:59:11

标签: api rest architecture hateoas

我认为我对RESTful架构的原则非常了解,但我还没有。

我似乎无法弄清楚的部分是客户如何知道每种资源可用的HTTP方法?如何在应用程序流中需要特定操作来继续进程?

简化示例:

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

客户将发布邮件请求:http://api.mycompany.com/orders

请求有效负载

<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”的链接可以是 GET PUT DELETE 请求。 rel =“invoice”的链接仅限于 GET 请求。与rel =“payment”的链接只接受 POST 请求。

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

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

您没有问的问题是,“客户如何知道裁判的'订单','发票'和'付款'是什么?”。

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

当记录这些内容时,当这些相关内容被解释为它们是什么,它们存在的原因以及您作为资源消费者将使用它们的内容时,那么利用这些资源所需的实际动词将被记录为好。

答案 1 :(得分:0)

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

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

  1. 他们使用不同的操作调用每个URI,并动态地找出哪些工作(返回2xx响应代码)以及哪些返回405 - Method Not Allowed
  2. 客户端程序员会提前阅读您的文档并对交互进行编码。
  3. 老实说,我从未见过#1在生产系统中实现过。 #2是我和大多数人必须编写使用REST API的客户端最有意义的。

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