javascript - 如何通过 Ajax 在 jQuery 中将请求正文传递给 AWS Lambda?
问题描述
我有一个简单的 AWS Lambda 函数,如下所示:
exports.handler = async function (event, context) {
console.log('Received event:', event);
context.done(null, JSON.stringify({"status": "success"}));
};
它仅记录事件。我的主要问题是当我使用 jQuery Ajax 发送请求时我没有得到事件正文,但是当我使用 Postman 时我得到了事件正文。下面是jQuery代码:
var name = $("#name-input").val();
var phone = $("#phone-input").val();
var email = $("#email-input").val();
var desc = $("#description-input").val();
var data = {
fullName : name,
phone : phone,
email : email,
desc : desc
};
$.ajax({
type: "POST",
URL : <AWS API Gateway URL that invokes the Lambda function>,
crossDomain: "true",
contentType: "application/json",
data: JSON.stringify(data),
success: function () {
alert("Successful!");
},
error: function () {
alert("Unsuccessful!");
}});
});
这是我在使用 jQuery Ajax 时在 CloudWatch 上获得的事件日志:
{
"version": "2.0",
"routeKey": "ANY /<Lambda Function Name>",
"rawPath": "/default/<Lambda Function Name>",
"rawQueryString": "",
"headers": {
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
"access-control-request-headers": "content-type",
"access-control-request-method": "POST",
"content-length": "0",
"host": <AWS API GATEWAY URL>,
"origin": "http://localhost",
"referer": "http://localhost/",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
"x-amzn-trace-id": "Root=1-5fc4a14a-1225b6fe203f78495dca8fef",
"x-forwarded-for": <MY IP ADDRESS>,
"x-forwarded-port": "443",
"x-forwarded-proto": "https"
},
"requestContext": {
"accounted": <AWS ACCOUNT ID>,
"apiId": <AWS API GATEWAY ID>,
"domainName": <AWS API GATEWAY URL>,
"domainPrefix": <AWS API GATEWAY ID>,
"http": {
"method": "OPTIONS",
"path": "/default/<Lambda Function Name>",
"protocol": "HTTP/1.1",
"sourceIp": <MY IP ADDRESS>,
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
},
"requestId": "Wz4juhL_IAMESnw=",
"routeKey": "ANY /<Lambda Function Name>",
"stage": "default",
"time": "30/Nov/2020:07:37:46 +0000",
"timeEpoch": 1606721866934
},
"isBase64Encoded": false
}
以下是我在使用 Postman 时在 CloudWatch 上获得的事件日志:
{
"version": "2.0",
"routeKey": "ANY /<Lambda Function Name>",
"rawPath": "/default/<Lambda Function Name>",
"rawQueryString": "",
"headers": {
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"cache-control": "no-cache",
"content-length": "116",
"content-type": "application/json",
"host": <API GATEWAY URL>,
"postman-token": "8d8f269e-da07-4bc8-987e-07bcd35bf587",
"user-agent": "PostmanRuntime/7.22.0",
"x-amzn-trace-id": "Root=1-5fc49fbc-0d95e3bd63009b4b6767b1c1",
"x-forwarded-for": <MY IP ADDRESS>,
"x-forwarded-port": "443",
"x-forwarded-proto": "https"
},
"requestContext": {
"accountId": "701682778102",
"apiId": <AWS APIGATEWAY ID>,
"domainName": <AWS API GATEWAY URL>,
"domainPrefix": <AWS APIGATEWAY ID>,
"http": {
"method": "POST",
"path": "/default/<Lambda Function Name>",
"protocol": "HTTP/1.1",
"sourceIp": <MY IP ADDRESS>,
"userAgent": "PostmanRuntime/7.22.0"
},
"requestId": "Wz3ldieTIAMEVcg=",
"routeKey": "ANY /<Lambda Function Name>",
"stage": "default",
"time": "30/Nov/2020:07:31:08 +0000",
"timeEpoch": 1606721468439
},
"body":
"{\n" +
" \"name\": \"Test user\",\n" +
" \"phone\": \"+xxxxxxxxxx\",\n" +
" \"email\": \"testuser@example.com\",\n" +
" \"desc\": \"test message\"\n" +
"}",
"isBase64Encoded": false
}
从上面的日志中可以看出,我在使用 Postman 时可以获得事件正文,但在使用 jQuery Ajax 时却没有得到正文。请让我知道当我使用 jQuery Ajax 时如何获取事件正文。先感谢您!
解决方案
推荐阅读
- python - 将音频文件转换为频谱图,然后将频谱图的数据保存到 txt 文件中
- java - 将 h2 数据库实现到现有的 spring-boot 应用程序
- reactjs - 如何使用 React HashRouter 作为路由参数?
- unreal-engine4 - Unity gameObject.parent 的 Unreal 等价物是什么?
- mysql - 创建一个返回 John Daniel 的函数 2009 年 12 月 6 日
- ruby-on-rails - 如果对象为空,则获取属性的更好方法
- image - Matlab上从灰度图像中提取区域像素的问题
- c# - 如何访问列表
类从接口继承时的对象属性? - python - 迭代生成键并计算字数
- python - 如何在 /apps for Python 中设置 pandas 库的路径,安装在 /opt 在 linux redhat 中