【问题标题】:RESTful way of getting a resource, but creating it if it doesn't exist yet获取资源的 RESTful 方式,但如果它尚不存在则创建它
【发布时间】:2013-09-24 08:01:46
【问题描述】:

对于我正在创建的 RESTful API,我需要一些功能来获取资源,但如果它不存在,则创建它然后返回它。我认为这不应该是 GET 请求的默认行为。我可以在我提供给 GET 请求的某个参数上启用此功能,但它似乎有点脏。

主要的一点是我只想为此做一个请求,因为这些请求将通过互联网连接可能很慢的移动设备完成,所以我想尽可能多地限制需要完成的请求尽可能。

我不确定这是否适合 RESTful 世界,但如果不适合,我会感到失望,因为这意味着我必须对 REST 理念进行一些修改。

有谁知道这样做的 RESTful 方式,或者不与 REST 理念相冲突的优美方式?

【问题讨论】:

  • 我认为共识是使用HTTP 202。见stackoverflow.com/questions/5079367/…
  • 我可能会返回一个 404,其中包含指向 POST 的链接,以使对象以默认状态创建(如果在发送 POST 请求时,对象仍然没有) t 还存在)

标签: api rest restful-architecture


【解决方案1】:

很简单:

  1. 请求:HEAD,检查响应代码:404 或 200。如果需要正文,请使用 GET。
  2. 不可用,执行 PUT 或 POST,服务器应以 204 和 Location 标头响应新创建资源的 URL。

【讨论】:

  • 好吧,很公平,但我想将其限制为一个请求,我会更新我的问题
  • 如果你想执行一个请求,你应该简单地发出一个被设计为幂等的 PUT 请求。
  • AFAIK,PUT 应该在资源存在的确切 URI 上完成(或者如果它尚不存在则将存在)。但是我想根据一些参数来获取资源,所以不知道URI也不知道是否存在。
  • 没错。然后你不能使用 PUT。我认为这不可能通过一个请求来实现。
【解决方案2】:

客户是否需要在创作过程中提供任何信息?如果是这样,那么您确实需要将 GET 和 POST 分开,否则您需要使用每个 GET 发送该信息,这将非常难看。

如果您发送的 GET 没有任何附加信息,那么如果在返回之前它不存在,那么后端没有理由无法创建资源。根据创建资源所需的时间量,您可能想要考虑异步并按照其他答案使用 202,但这意味着您的客户端必须处理(但)另一个响应代码,因此可能会更好只是等待资源完成并返回。

【讨论】:

  • 正如我所说,我不希望它成为 GET 的默认行为。如果资源不存在,我希望“正常” GET 操作返回 404。然后我想要一些替代方法来创建资源,如果它不存在。正如我所说,我可以使用 GET 请求中的参数来执行此操作,例如 createifnotexist=true 或其他东西。我也许也可以使用 HTTP 标头来做到这一点。然而,我想知道人们是否有其他/更好的解决方案。
  • 如果您需要以某种方式对其进行标记以表明您想要做一些不同的事情,那么您可以放置​​的三个地方是 URL、HTTP 标头或消息正文。当您使用 GET 执行此操作时,我建议放置它的最佳位置是 URL 中的查询参数。不过,老实说,我认为您应该选择始终使用非标准 GET 或回退到两个请求,而不是尝试以这种方式改变行为。除非您发送额外参数的时间非常明显,但在这种情况下,在服务器端逻辑中对其进行编码会更安全。
  • rfc 限制 GET 获取资源,而不是创建资源,无论是否有信息,并且执行 GET 并返回 201(已创建)也会很奇怪。如果您的回答是返回 200(好的),那么您就没有解释状态发生了什么
猜你喜欢
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多