S3静态托管页面中$.post请求类型及工作原理咨询
问题解答
核心结论
$.post() 发送的是POST请求,这和你Lambda仅配置接收GET请求的设置不匹配,会导致请求无法被正确处理。
详细说明
jQuery的$.post()是$.ajax()的简化封装,默认就会将请求方法设置为POST,你代码里的这行:
$.post(backend_url, JSON.stringify({ "vote": vote }), function(result,status){ ... });
完全等价于手动指定请求方法的$.ajax()写法:
$.ajax({ url: backend_url, type: "POST", data: JSON.stringify({ "vote": vote }), success: function(result,status){ ... } });
适配现有Lambda配置的两种解决办法
办法1:修改前端代码为GET请求
把$.post()替换为$.get(),同时调整参数传递方式(GET请求参数需拼接在URL上,而非请求体):
// 使用$.get的简化写法 $.get(backend_url + "?vote=" + vote, function(result,status){ // 保留原有的回调逻辑 }); // 或者用$.ajax明确指定GET方法 $.ajax({ url: backend_url, type: "GET", data: { vote: vote }, // jQuery会自动将参数拼接到URL末尾 success: function(result,status){ // 保留原有的回调逻辑 } });
办法2:调整后端配置适配POST请求
从HTTP语义来说,投票提交属于数据写入操作,更适合用POST请求。你可以在API Gateway中添加POST方法的集成,指向你的Lambda函数,同时修改Lambda代码,读取POST请求体中的vote参数(也就是你当前用JSON.stringify传递的数据)。
额外提示
你代码里的<form>标签设置了method="POST",但因为点击事件最后写了return false;,阻止了表单的默认提交行为,所以实际发起请求的是$.post()的逻辑,form的method设置不会生效。
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

