如何使用检查订单状态的自定义条件实现条件请求?
例子:
- 用户将发送带有标题“x-if-ready-for-payment”的 GET /api/order:true。
- 如果订单已准备好付款,则响应将是订单和状态代码 200。
- 如果订单尚未准备好付款,则响应将显示错误消息,状态码为 412。
这是正确的方法还是我完全错过了条件要求的要点?
如何使用检查订单状态的自定义条件实现条件请求?
例子:
这是正确的方法还是我完全错过了条件要求的要点?
有条件的请求基本上(但在这里阅读更多)意味着:
If-None-Match
,If-Modified-Since
) ,则阻止(重)响应负载If-Match
, If-Unmodified-Since
)另请参阅RFC 7232,超文本传输协议 (HTTP/1.1):条件请求:
条件 GET 请求是 HTTP 缓存更新最有效的机制 [RFC7234]。条件也可以应用于状态更改方法,例如 PUT 和 DELETE,以防止“丢失更新”问题:一个客户端意外覆盖另一个客户端的工作,该客户端一直在并行执行。
它不适用于您的自定义业务逻辑。x-if-ready-for-payment
听起来您将需要发明数十个仅适用于单个或少数请求的新标头。
确定您实际上要解决的问题,并找到不同的解决方案。
这是正确的方法还是我完全错过了条件要求的要点?
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
或其他......)