我的POST响应是否已发送给客户端

时间:2014-03-03 09:35:33

标签: php api post

所以,我想弄明白,是否有可能知道我的回复已成功传递给客户。 我们拥有的是20个POS系统(用不同的技术编写,如dot.net和java),它们向我们的API发送POST请求(php / yii)。当我们响应这些请求时,我们想知道的是成功传递的响应。 我们需要这个,因为可能存在这样的情况,当我们向客户收费时,但POS不知道这一点,并且可能会因开放订单而陷入困境。我们无法确定POS是否会发送另一个请求,我们不能搞乱POS码。 如果我们知道响应未送达,我们可以回滚充电。 是否可以使用基本的POST请求? 正如我所说,我们的项目是在PHP中,但接受任何其他语言的代码片段或文档。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是Two Generals' Problem,对这些类型的问题没有共同的正确答案。但是你可以强制要求达到对话的水平,因为缺乏联系不会导致/禁止重要的行动,只有重新发送/重新请求确认。

在这里你没有一个很好的选择。更好的方法是,一旦服务器获得完整的事务请求,它就会被执行;无论客户的状态如何。当POS没有得到回复时,它会使用完全相同的唯一ID重试事务,因此服务器可以第二次忽略它,并说它已完成。因为这是交易发生在分布式系统上的情况,所以将服务器的知识视为基本且安全的更有意义,让客户端处于迷雾状态。如果POS无法摆脱雾,它应该重试。当然,对于一个设计来说你很难解决已经非常混乱的POS代码(它的设计目前已经破坏了健壮性概念)。

您要实现的目标(监控基础连接)不会有多种原因:

  • 连接被设计为在收到回复后关闭;这通常与IP级别以上的终止无法区分,
  • HTTP不是为保证邮件到达而设计的(即没有“正常关闭请求”命令可以帮助你) - 这就是为什么HTTP是这个协议的错误选择,
  • PHP + webserver不擅长等待,如果所有以前的点都不存在,即使这样很难保持PHP运行(例如在连接关闭后检查任何状态),因为它旨在服务于请求,然后忘掉它。