0

如何使用检查订单状态的自定义条件实现条件请求?

例子:

  • 用户将发送带有标题“x-if-ready-for-payment”的 GET /api/order:true。
    • 如果订单已准备好付款,则响应将是订单和状态代码 200。
    • 如果订单尚未准备好付款,则响应将显示错误消息,状态码为 412。

这是正确的方法还是我完全错过了条件要求的要点?

4

2 回答 2

4

有条件的请求基本上(但在这里阅读更多)意味着:

  1. 如果客户端具有与服务器上仍然相同的缓存表示(例如If-None-MatchIf-Modified-Since) ,则阻止(重)响应负载
  2. 如果客户端的版本比服务器的版本旧(例如 ( If-Match, If-Unmodified-Since)

另请参阅RFC 7232,超文本传输​​协议 (HTTP/1.1):条件请求

条件 GET 请求是 HTTP 缓存更新最有效的机制 [RFC7234]。条件也可以应用于状态更改方法,例如 PUT 和 DELETE,以防止“丢失更新”问题:一个客户端意外覆盖另一个客户端的工作,该客户端一直在并行执行。

它不适用于您的自定义业务逻辑。x-if-ready-for-payment听起来您将需要发明数十个仅适用于单个或少数请求的新标头。

确定您实际上要解决的问题,并找到不同的解决方案。

于 2020-11-04T13:50:39.987 回答
2

这是正确的方法还是我完全错过了条件要求的要点?

CodeCaster有正确的想法;我想尝试更广泛的方法

HTTP 是一种应用协议,其应用领域是通过网络传输文档——Jim Webber,2011

所有元数据——方法标记、状态代码、标题——都属于“文档传输”域。


REST 的一个关键约束是统一的接口;网络上的所有资源都以相同的方式理解请求消息。

GET /api/order

应该具有相同的语义

GET /cute/kitten.jpg

因为语义是标准化的,并且实现遵循这些标准,所以我们最终得到了一堆通用工具(如网络浏览器),它们可以以很多有趣的方式使用——你可以用它来进行购物和银行业务与您在 youtube 上观看视频或在 StackOverflow 上提问的浏览器相同,这一切都“正常工作”。

引入特定于特定服务器或特定资源的标头与当前相反 - 您可以编写一个也可以理解的定制客户端x-if-ready-for-payment,但现在我们正在耦合到自定义客户端,而不是能够使用任何 HTTP 标准有意识的文档阅读器。

当然,新标头可以标准化 - 我们有向IANA 注册中心添加新 HTTP 标头的协议,但如果您的标头不是通用的,那么在注册后实现采用将是一个额外的麻烦。


如果客户询问订单状态,那么您可能应该做的是将该状态包含在资源的表示中,例如

GET /api/order
200 OK
Content-Type: text/plain

x-if-ready-for-payment=true

如果客户端试图更改订单状态,那么您使用消息语义来指示我们正在尝试更改服务器的资源副本,例如:

POST /api/order
Content-Type: text/plain

x-if-ready-for-payment=true

(我的示例中的内容类型只是为了减少歧义,它可以很容易地是application/x-www-form-urlencoded, 或application/json,application/prs.djoloho+json或其他......)

于 2020-11-04T14:56:47.710 回答