首页 > 解决方案 > 如何通过 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 时如何获取事件正文。先感谢您!

标签: javascriptnode.jsajaxaws-lambdaaws-api-gateway

解决方案


推荐阅读