【问题标题】:What is the right way to define a generate endpoint in REST?在 REST 中定义生成端点的正确方法是什么?
【发布时间】:2020-11-05 11:24:52
【问题描述】:

我正在构建一个 REST API,但我不太确定表示生成数据的端点的正确方法是什么。假设资源是关于“项目”的,我有通常的端点:

  • GET /items => 列出项目
  • POST /items => 创建一个新项目
  • GET /items/{id} => 获取现有项目
  • PUT /items/{id} => 更新现有项目
  • DELETE /items/{id} => 删除现有项目

现在,我还有一个进程,可以根据系统中的一些参数或配置生成物品。使用 REST 定义此端点的正确方法是什么?

我也很想使用 POST /items 但是这个已经被用来创建一个“单个”新项目。有时使用是正确的:

  1. POST /items?from=2020-07-15&to=2020-07-21 for with no body => 这会创建一个项目列表
  2. POST /items 在正文中有一个项目 => 这会创建一个项目

感谢您的意见!

【问题讨论】:

  • 感谢@dbaltor 的建议。我的问题更倾向于基于有效负载或查询参数让相同的端点行为不同是否“正确”REST 方式。
  • 欢迎。我相信 POST 是唯一的方法,因为您的请求不会是幂等的。然而,HTTP 动词和 URI 并不是唯一需要考虑的东西。处理(原子或非原子,同步或异步)以及使用正确代码(200、202 或 400)的相应响应也至关重要。这就是为什么我向您推荐一个全面回复的链接。

标签: rest


【解决方案1】:

在 REST 中重载 POST 是完全可以接受的。

您可能在网络上描绘了两种不同的形式,它们承诺做不同的事情,共享相同的操作 uri。浏览器会做完全正确的事情 - 获取表单的输入字段,组成请求的主体,然后使用相同的 target-uri 发送生成的 POST 请求。

只要服务端能够通过payload区分这两种含义,就没有难度了。

一般来说,在您进行远程创作以外的任何事情时,POST 都是正确的答案。请参阅 Fielding 2009:It is okay to use POST

从客户端的角度来看,target-uri 并不重要,所以如果你想创建一个不同的资源来处理批量创建用例,那也没关系。我们可能关心使用的主要原因

POST /items

是不是这样做成功会自动invalidate之前缓存的表示通过

GET /items

【讨论】:

  • 我非常喜欢过载解决方案。我可能应该更好地记录我的端点以声明POST /items 接受项目列表以及可选的查询参数,这些参数将生成项目列表。谢谢
【解决方案2】:

那肯定是 POST。 您可以使用 POST /item 和项目主体,然后使用 POST /item/batch?param=1&param=2 之类的东西根据您传递的参数批量生成项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2021-05-23
    • 1970-01-01
    • 2021-05-18
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多