如何解决关于 API 网关 URL 错误的任何想法SES、API 网关、Lambda 与 javascript/html 的集成?
我之前使用 php 网络表单创建了网站,但我开始尝试在从 S3 启动网站时尝试在 AWS 中使用 Lambda/API 网关/SES 组合,以创建动态提交表单。如果您想快速浏览一下提交表单(和错误),请看这里:https://precious-gemstones.com/about.html
这是我的 javascript,我已将其存储在 S3 存储桶的根级别:
function submitToAPI(e) {
e.preventDefault();
var URL = "https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email/email";
var Namere = /[A-Za-z]{1}[A-Za-z]/;
if (!Namere.test($("#name-input").val())) {
alert ("Name must be at least 2 characters.");
return;
}
if ($("#email-input").val()=="") {
alert ("Please enter your email.");
return;
}
var reemail = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,6})?$/;
if (!reemail.test($("#email-input").val())) {
alert ("Please enter a valid email address.");
return;
}
var name = $("#name-input").val();
var email = $("#email-input").val();
var message = $("#message-input").val();
var data = {
name : name,email : email,message : message
};
$.ajax({
type: "POST",url : "https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email/email",dataType: "json",crossDomain: "true",contentType: "application/json; charset=utf-8",data: JSON.stringify(data),success: function () {
// clear form and show a success message
alert("Thank you for your inquiry!");
document.getElementById("contact-form").reset();
location.reload();
},error: function () {
// show an error message
alert("Error; please try again.");
}});
}
这是我的 Lambda 函数:
var AWS = require('aws-sdk');
var ses = new AWS.SES();
var RECEIVER = 'inquiry@precious-gemstones.com';
var SENDER = 'no-reply@precious-gemstones.com';
var response = {
"isBase64Encoded": false,"headers": { 'Content-Type': 'application/json','Access-Control-Allow-Origin': 'precious-gemstones.com'},"statusCode": 200,"body": "{\"result\": \"Success.\"}"
};
exports.handler = function (event,context) {
console.log('Received event:',event);
sendEmail(event,function (err,data) {
context.done(err,null);
});
};
function sendEmail (event,done) {
var params = {
Destination: {
ToAddresses: [
RECEIVER
]
},Message: {
Body: {
Text: {
Data: 'name: ' + event.name + '\nemail: ' + event.email + '\nmessage: ' + event.message,Charset: 'UTF-8'
}
},Subject: {
Data: 'Gemstone inquiry: ' + event.name,Charset: 'UTF-8'
}
},Source: SENDER
};
ses.sendEmail(params,done);
}
这是我的 html 代码片段:
<div class="contact-form">
<form id="contact-form" method="post" action="https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email/email">
<input name="name" type="text" class="form-control" placeholder="Your Name" required>
<br />
<input name="email" type="email" class="form-control" placeholder="Your Email" required>
<br />
<textarea name="message" class="form-control" required rows="10">Your Message</textarea>
<br />
<input type="submit" class="form-control submit" value="Send inquiry">
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="submitToAPI.js"></script>
</body>
有什么想法吗? 非常感谢你的帮忙! 更新:从我的 Lambda 触发器看到的 API 网关信息如下: API 端点:https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email/email API 类型:REST 授权:无 方法:POST 资源路径:/email 阶段:电子邮件
不需要密钥或授权,当我从 Lambda 测试时,设置工作(我收到电子邮件)。从 API Gateway post 方法测试也成功。但是,它在我的网站上不起作用,这让我相信它是我的 html/javascript 代码中的内容,我将在今晚或明天审查/修改它 - 但任何见解都值得赞赏!
解决方法
创建阶段时,显示的链接不包含 URL 的资源部分:
在你的代码中
aws api 网关 URL:https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email
您应该调用代码的实际网址必须是
api + 您的资源名称:https://ryj32uh9ki.execute-api.us-east-1.amazonaws.com/email/
因此,如果我是对的,您将缺少 api url 末尾的资源名称。
例如我有这个api网关部署
api 网址:https://asdasdsadsa.execute-api.eu-central-1.amazonaws.com/v1
我从浏览器为名为 myaccounts 的资源调用的实际 URL 如下所示:
api + 资源:请求 URL:https://asdasdsadsa.execute-api.eu-central-1.amazonaws.com/v1/myaccounts
如果您的方法配置如下所示,则意味着它没有配置任何授权(我假设您没有按照您在此处描述的问题)
编辑
似乎来自你分享的错误信息
{"message": "无法将请求正文解析为 json: 无法将有效负载解析为 json: 无法识别的令牌 'name': 期待 'null'、'true'、'false' 或 NaN\n 在 [Source : (byte[])"name=test&email=test%40yahoo.com&message=Your+Message";行:1,列:6]"}
您将 URL 编码的数据发送到 API 网关上的 application/json 类型设置。
所以你需要在调用api端点时将你的URL编码数据转换为json格式
对应的开发者表单线程:HOWTO: Mapping Template v3.0 to convert form POST data or GET query to JSON
,您需要禁用对端点的授权。 How to open anonymous access to AWS API Gateway resource 或者将端点授权合并到脚本中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。