Chrome中AWS Lambda Function URL重复触发问题求助
Chrome触发Lambda重复POST请求的原因与解决办法
可能的原因
- Chrome的预加载/重试机制:当Lambda功能URL未返回标准HTTP响应(比如当前代码无任何返回内容),Chrome会判定请求失败并自动发起重试;另外Chrome的资源预加载功能可能会对疑似需要后续访问的URL发起额外请求。
- 浏览器扩展干扰:部分广告拦截、隐私类扩展可能会修改请求流程,导致重复发送POST请求。
解决办法
1. 给Lambda添加幂等性控制(最可靠方案)
不管浏览器是否重复发送请求,确保同一请求不会重复创建Trello卡片。可以利用Lambda的请求ID作为唯一标识,在创建卡片时附带该ID,或者先查询Trello是否已有对应ID的卡片:
import json import urllib3 def lambda_handler(event, context): http = urllib3.PoolManager() request_id = context.request_id # 可选:先查询Trello列表中是否已有带该request_id的卡片 # check_r = http.request('GET', f'https://api.trello.com/1/lists/<listid>/cards?key=<mykey>&token=<mytoken>&fields=desc') # if any(request_id in card['desc'] for card in json.loads(check_r.data)): # return {'statusCode': 200, 'body': json.dumps({'message': 'Card already exists'})} # 创建卡片时附带请求ID r = http.request( 'POST', 'https://api.trello.com/1/cards', fields={ 'key': '<mykey>', 'token': '<mytoken>', 'name': 'new card', 'idList': '<listid>', 'desc': f'Request ID: {request_id}' } ) return { 'statusCode': 200, 'headers': {'Content-Type': 'application/json'}, 'body': json.dumps({'message': 'Card created'}) }
2. 修正Lambda的响应格式
当前代码没有返回任何HTTP响应,Chrome会因无法确认请求状态而重试。返回标准的200响应并添加缓存控制头,阻止预加载:
import json import urllib3 def lambda_handler(event, context): http = urllib3.PoolManager() r = http.request('POST', 'https://api.trello.com/1/cards?key=<mykey>&token=<mytoken>&name=new card&idList=<listid>') return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', 'Cache-Control': 'no-store, no-cache' }, 'body': json.dumps({'success': True}) }
3. 排除浏览器扩展干扰
使用Chrome无痕模式测试请求,如果问题消失,说明是某个扩展导致的,逐一禁用扩展排查即可。
4. 调整触发方式
将二维码指向一个简单的HTML页面,通过点击按钮触发POST请求,而非直接访问URL就执行操作,更符合浏览器交互逻辑:
<!DOCTYPE html> <html> <body> <button onclick="sendRequest()">点击提交订购请求</button> <script> function sendRequest() { fetch('你的Lambda功能URL', {method: 'POST'}) .then(res => res.json()) .then(data => alert('订购请求已提交')); } </script> </body> </html>
内容的提问来源于stack exchange,提问作者user25566469
相关产品推荐
相关产品推荐

