REST方法:如果数据正在修改,那么一个GET是否比一个具有1个字符体的PUT更好

REST方法:如果数据正在修改,那么一个GET是否比一个具有1个字符体的PUT更好,rest,put,content-length,http-status-code-411,Rest,Put,Content Length,Http Status Code 411,我们有一对REST应用程序,它们正试图通过使用一个确认URL来实现事务的轻版本,该URL指示是时候让双方“提交”修改了。以下是步骤-这些不是立即完成的-在步骤之间可能会暂停供最终用户批准 应用程序A批准并将更改分阶段通知应用程序B 它已经准备好做出改变 应用程序B阶段性地进行更改,并通知应用程序A已完成更改 已准备就绪,并提供应用程序A将访问的确认URL 当它执行提交时“命中” 应用程序A在收到后“点击”确认URL, 应用程序B提交更改并返回200。如果应用 A得到200分,否则每个人都会退后

我们有一对REST应用程序,它们正试图通过使用一个确认URL来实现事务的轻版本,该URL指示是时候让双方“提交”修改了。以下是步骤-这些不是立即完成的-在步骤之间可能会暂停供最终用户批准

  • 应用程序A批准并将更改分阶段通知应用程序B 它已经准备好做出改变
  • 应用程序B阶段性地进行更改,并通知应用程序A已完成更改 已准备就绪,并提供应用程序A将访问的确认URL 当它执行提交时“命中”
  • 应用程序A在收到后“点击”确认URL, 应用程序B提交更改并返回200。如果应用 A得到200分,否则每个人都会退后
  • 问题是关于确认URL的正确操作是什么。有两个“合理”的选择——每个都有缺点:

    • 使用GET请求-缺陷在于数据正在修改,并且 不应允许使用GET

    • 使用PUT请求-当数据发生更改时,这会更有意义,并且它
      只能发生一次。但是PUT请求需要一个
      内容长度头,由于没有数据要发送,许多HTTP 客户端库拒绝设置“内容长度:0”。所以他们生产 一个“坏”的看跌期权,当你发送一个“坏”的看跌期权时,你经常(正确地)收到411 没有内容项的放置。解决方案是发送单个字符 身体-这使推杆有效,但感觉有点恶心

    这是一个狭义的问题,询问我们是否应该使用带有单个字符体的GET或PUT来设计协议

    需要明确的是,并非所有HTTP客户机都拒绝发送Content Length:0标头,但Java HttpURLConnection仅在您实际发送PUT数据时才会发送标头。而且并非所有HTTP服务器在收到没有内容长度头的PUT时都抛出411,但Rails(和其他)正确地执行了这一规则。我们需要这个协议来跨所有语言、HTTP服务器和HTTP客户端工作,所以“在X中全部重写”的答案是没有帮助的


    这是一个REST哲学问题,而不是“哪种语言更好”的问题。

    免责声明:观点。。。现在,在我看来,通过REST资源,您的应用程序有一个“提交”操作的“隐含”信封。当应用程序B提交并返回200后,应用程序A无法提交时会发生什么情况?它不调用应用程序B的确认URL来告诉它回滚吗?我认为在这种情况下,它将使用PUT和“回滚”操作调用应用程序B的确认URL。基本上,在REST/模型视图中查看时,您的看跌期权不是空的,并且您正在有效地更新某种事务?你可以做空帖子,对吗?另外,确认呼叫真的是幂等的吗?每次在这里都会可靠地进行同样的工作吗?我个人会在得到或放之前考虑这里的帖子,但我很可能没有走上正确的轨道…免责声明:意见。。。现在,在我看来,通过REST资源,您的应用程序有一个“提交”操作的“隐含”信封。当应用程序B提交并返回200后,应用程序A无法提交时会发生什么情况?它不调用应用程序B的确认URL来告诉它回滚吗?我认为在这种情况下,它将使用PUT和“回滚”操作调用应用程序B的确认URL。基本上,在REST/模型视图中查看时,您的看跌期权不是空的,并且您正在有效地更新某种事务?你可以做空帖子,对吗?另外,确认呼叫真的是幂等的吗?每次在这里都会可靠地进行同样的工作吗?我个人会在得到或放之前考虑这里的帖子,但我很可能在那里没有走上正确的轨道。。。