【问题标题】:How can a "Find or Create" operation be implemented in a RESTful service?如何在 RESTful 服务中实现“查找或创建”操作?
【发布时间】:2014-07-26 02:52:10
【问题描述】:

对于提出“将某些功能操作塞进 RESTful 思维方式的最佳方法是什么”问题提前道歉。无意在此展开辩论;我想看看是否有可接受的模式来执行特定任务。

假设我想在 API 中使用一个端点来为用户/附属公司对创建“推荐代码”。我可以的

POST /referral_codes
{"user":1, "affiliate":88}

并使用 201 CREATED 和带有新代码的正文进行响应。

但如果代码已经存在,我会退回现有的推荐代码。在这种情况下,201 是不合适的(没有创建任何内容)。如果您大大扩展了 409 的意图,则 200 OK 可能有意义,并且 409 CONFLICT 有意义 - 但是要求已经存在的代码并不是真正的错误;我试图模仿的操作称为“查找或创建”。

另一个选项是使端点成为 GET(即GET /referral_codes?customer=1&affiliate=88),因为客户端不需要知道服务器是否必须创建资源来满足请求。而且由于它仍然是幂等的(后续调用将返回第一次创建的代码),我不会做任何让 Restafarian 反对的事情,或者我会反对吗?

是否存在可接受的“查找或创建”模式?

【问题讨论】:

  • Find 通常是 GET,create 通常是 POST,因此您不会以 REST 方式对该操作进行建模。我会将其拆分为 2 个请求,或者为操作提供更好的名称...正如 Will 所写,POST 是您唯一的选择,因为 afaik 它适用于您将使用新的 HTTP 方法建模的操作。

标签: rest


【解决方案1】:

我会 POST 和 200 到现有资源的位置。语义更简单。

至于 GET 选项,它只是第二次幂等,实际上是第一次创建资源。

如果您有任何可以“获取所有状态”的聚合资源,您可以判断这一点,并且您会看到新的资源不存在,但如果您直接获取它,Shazam 就在那里,这是一个错误。

我认为在这种情况下使用 200 POST 是最有效的。

【讨论】:

  • 这是一个极好的洞察力。我确实有GET /referral_codes 来获取所有代码,每个代码的格式为{"customer":x, "affiliate":y}。你的场景表明 GET 创建将是一个错误。有理有据!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2011-02-12
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多