You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:56:13