如何处理超时POST请求(How to deal with timed out POST reque

2019-07-03 16:59发布

在RESTful SOA,假设我发出通过AJAX POST请求,但我不明白的请求超时之前的响应。 进一步假设一个重新提交的请求将是有害的。 POST不幂等。 比如,也许我张贴的钱转帐。 如果我没有得到回应,我不知道,如果服务器处理请求。

什么是处理这个最好的做法,假设我有过客户端和服务端控制?

我的初始想法是包括随机数(即,伪ID;某种唯一标识符),每个POST请求; 例如,也许在IF-None-Match头的值。 通过这种方法,客户端可以通过编程方式重新发出具有相同的伪ID和服务器,如果它包含了重复值可以拒绝它超时请求。

Answer 1:

有许多的方法,我听说过,试图解决这个问题

  1. 获取当前状态。

    设计服务,因此,如果POST失败,客户端可以发出对同一资源的GET和根据返回的数据,他们可以决定是否POST成功的不是。

    这种方法的问题是在开机自检集合中创建一个新的项目的情况下,可能难以为客户端确定后成功与否(即没有我的帖子添加项目或做别人的?)

  2. 如果-匹配

    使用If-Match头,以防止POST被重复。 例如,如果该信息是将商品的集合,集合目前拥有ETag737060cd8c284d8af7ad3082f209582d 。 如果If-Match737060cd8c284d8af7ad3082f209582d是在POST使用,那么POST将只在集合的成功ETag737060cd8c284d8af7ad3082f209582d ,这将增加该项目,并产生新ETag的收集。 重复这个阶段的POST将只返回412 Precondition Failed

    这种方法的问题是,当你得到一个412 Precondition Failed ,你不能确定,如果你的后修饰的收集,还是别人的。

  3. POST然后把

    设计你的服务,从来没有从POST留存数据。 相反,POST创建与发布内容,这在“待定”状态的临时资源。 此临时资源,然后“提交”以PUT。 通过这种方法,你不在乎,如果你的帖子的时候的了,只是再次请求POST,这个时候你会希望得到您的临时资源。 如果PUT提交的资源时的出来,你不在乎要么,因为PUT是幂等。

    这种方法的唯一真正的缺点是管理临时资源,并在客户端所需的额外工作所需的额外工作。

    更新

  4. 杜撰

    使用在所述请求中的随机数(也称为消息ID,事务ID,请求ID,相关性ID)是用于解决该问题的常用方法; 但它可以具有可伸缩性问题。 如果你承诺拒绝使用一个先前随机数的所有帖子,然后你需要扫描现有的POST记录,以确定是否现时已被使用过。 不是一个问题,当你只有几千个帖子,但是当你有几百万就可以成为问题(特别是如果你还没有存储随机数的方式,快速查询)。

    您可以通过减少你的承诺,拒绝使用一定时间内一个先前随机数的所有帖子(例如,最后24小时)减轻,但如果第一个POST超时和客户端断开该时间表,然后他们回来的同样的老位置,在那里他们不知道如果第一个职位是成功的,没有办法确定他们是否应该重新发布与否。



文章来源: How to deal with timed out POST requests