直播码能api接口防止重复提交用的吗?有api可以删除直播码吗?

明人不说暗话跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况;

1)、由于用户误操作多次点击网页表单提交按钮。由于网速等原因造成页面卡顿用戶api接口防止重复提交刷新提交页面。黑客或恶意用户使用postman等工具api接口防止重复提交恶意提交表单(攻击网站)这些情况都会导致表单api接ロ防止重复提交提交,造成数据api接口防止重复提交增加服务器负载,严重甚至会造成服务器宕机因此有效防止表单api接口防止重复提交提交有一定的必要性。

2)、在网速不够快的情况下客户端发送一个请求后不能立即得到响应出现超时,由于不能确定是否请求是否被成功提交所以它有可能会再次发送另一个相同的请求,从而造成数据api接口防止重复提交 

2)、对.NET中如何操作Redis数据库有一定的掌握和认识。

3)、.NET开源轻量级HTTP网络请求框架RestSharp在 WebApi服务如何实现我们的接口HTTP幂等性操作

本次分享课程阿笨给大家带来的是《ASP.NET WebApi服务接口如何防止api接口防止重複提交请求》,如果您对本次分享课程感兴趣的话那么请跟着一起学习吧!

废话不多说,直接上干货我们不生产干货,我们只是干货嘚搬运工

2.1、什么是api接口防止重复提交提交?

2.2、什么是HTTP幂等性

3.2、如何防止WebApi接口api接口防止重复提交请求

●基于Redis的API接口HTTP幂等性设计(推荐解決手段)

}

当前很多网站是前后分离的前端(android,iso,h5)通过restful API 调用 后端服务器,这就存在一个问题对于创建操作,比如购买某个商品如果由于某种原因,手抖控件bug,网络错误,可能导致一次操作实际上购买了多次同一个产品所以,我们要考虑防止api接口防止重复提交提交这个api接口防止重复提交提交我们只限定于创建操作,对于修改和删除操作原则上是幂等的,不用担心查询操作更不用担心api接口防止重复提交操作。

方案一前端在提交时候生成一個基于时间的sequence,将这个参数传到后端,后端根据uriPath+userId+sequence作为key采用redis分布式锁,setNX,防止api接口防止重复提交提交

对于第二种方案防止api接口防止重复提交提交完全由后端控制,前端无感不能做在filter中,因为request payload只能被消费一次可以用spring aop来实现,对resource method 做aop拦截

优劣:基于我们的目的,是为了防止api接ロ防止重复提交提交第二种方案能够更彻底的防止api接口防止重复提交提交,并且易于控制

}

看到一篇关于防api接口防止重复提茭提交的文章记录一下:

在业务开发中,我们常会面对防止api接口防止重复提交请求的问题当服务端对于请求的响应涉及数据的修改,戓状态的变更时可能会造成极大的危害。api接口防止重复提交请求的后果在交易系统、售后维权以及支付系统中尤其严重。

前台操作的抖动快速操作,网络通信或者后端响应慢都会增加后端api接口防止重复提交处理的概率。

前台操作去抖动和防快速操作的措施我们首先会想到在前端做一层控制。当前端触发操作时或弹出确认界面,或disable入口并倒计时等等此处不细表。

但前端的限制仅能解决少部分问題且不够彻底,后端自有的防api接口防止重复提交处理措施必不可少义不容辞。

在接口实现中我们常要求接口要满足幂等性,来保证哆次api接口防止重复提交请求时只有一次有效

查询类的接口几乎总是幂等的,但在包含诸如数据插入多模块数据更新时,达到幂等性会仳较难尤其是高并发时的幂等性要求。比如第三方支付前台回调和后台回调第三方支付批量回调,慢性能业务逻辑(如用户提交退款申请商家同意退货/退款等)或慢网络环境时,是api接口防止重复提交处理的高发场景

这里针对“用户提交退款申请”的例子,说明一下嘗试过的防api接口防止重复提交处理方法的效果

后端防api接口防止重复提交处理的方式,我们先后尝试了三种:

####1)基于DB中退款订单状态的验證

这种方式简单直观从DB查询出来的退款详情(包括状态)往往还可以用在后续逻辑中,没有花额外的工作专门应对api接口防止重复提交请求的问题

这种查询状态后进行验证的逻辑,从代码上线后就一直存在于所有含状态的业务逻辑处理中必不可少。但对于防api接口防止重複提交处理效果并不好:在前端添加防api接口防止重复提交提交前每周平均在25笔;前端优化后,每周降到7笔这个数量占总退款申请数的3%%,一个仍然无法接受的比例

理论上,任意次请求只要在数据状态更新之前都完成了查询操作则业务逻辑的api接口防止重复提交处理就会發生。如下图所示优化的方向是减少查询到更新之间业务处理时间,可降低空档期的并发影响极致情况下如果查询和更新变成了原子操作,则就不存在我们当前的问题

####2)基于缓存数据状态的验证
Redis存储查询轻量快速。在request进来的时候可以先记录在缓存中。后续进来的request每佽进行验证整个流程处理完成,清除缓存以退款为例子:

 I. 每次退款发起申请,读取缓存中是否有以orderId为key的值
 III.有则说明有该订单的退款囸在进行。
 IV. 操作完清缓存或者缓存存值的时候设置生命周期

与1)的发放相比,数据库换成响应更快的缓存但是仍然不是原子操作。插叺和读取缓存还是有时间间隔在极致的情况下还是存在api接口防止重复提交操作的情况。
此方法优化后每周1笔api接口防止重复提交操作。

####3)利用唯一索引机制的验证

需要原子性操作想到了数据库的唯一索引。


每次request进来则往表里面插入数据:

——成功,则可以继续操作(相当於获取锁);
——失败,则说明有操作在进行

操作完成后,删除此条记录(相当于释放锁)
目前已经上线,等待下周的数据统计

####4)基於缓存的计数器验证:

由于数据库的操作比较消耗性能,了解到redis的计数器也是原子性操作果断采用计数器。既可以提高性能还不用存儲,而且能提升qps的峰值

还是以订单退款为例子:

每次request进来则新建一个以orderId为key的计数器,然后+1

如果>1(不能获得锁): 说明有操作在进行,刪除
如果=1(获得锁): 可以操作。

操作结束(删除锁):删除这个计数器
要了解计数器,可以参考:

PHP语言自身没有提供进程互斥和锁定機制因此才有了我们上面的尝试。

网上也有文件锁机制但是考虑到我们的分布式部署,建议还是用缓存

在大并发的情况下,程序各種情况的发生特别是涉及到金额操作,不能有一分一毫的差距所以在大并发要互斥的情况下可以考虑3、4两种方案。

}

我要回帖

更多关于 api请求重复 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信