在 Python Lambda 中从 POST 请求中提取参数

D3v*_*dom 4 javascript python post request aws-lambda

上下文:我正在尝试从 JavaScript 向用 Python 编写的 AWS lambda 函数发出 POST 请求。然后我会将 POST 请求中的信息输入到数据库中。

问题:我似乎无法弄清楚如何从 POST 请求中获取信息。并将其存储到变量中。

我尝试使用事件 ['Username'],它在 AWS 提供的测试模拟中有效,但实际上并没有。

<form method="POST" action="https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser">
            <label for="Username">Username:</label><br>
            <input type="text" id="Username" name="Username" value=""><br>
            <label for="password">Password:</label><br>
            <input type="text" id="Password" name="Password" value=""><br><br>
            <input type="submit" id="submit" value="Submit" >
    </form> 
Run Code Online (Sandbox Code Playgroud)
POST /Prod/RegisterUser HTTP/1.1
Host: fake.execute-api.us-east-1.amazonaws.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 24
Connection: close
Upgrade-Insecure-Requests: 1

Username=jat&Password=sa
Run Code Online (Sandbox Code Playgroud)
import pymysql
import json

#endpoint = 'fake.us-east-1.rds.amazonaws.com'
#username = 'admin'
#password = 'admin'
#database_name = 'fake'

#connection
#connection = pymysql.connect(endpoint, user=username, passwd=password, db=database_name)

def lambda_handler(event, context):

   user =  event['Username']
   password = event['Password']
   
   return {
      "Username": user,
      "Password":password
   }
Run Code Online (Sandbox Code Playgroud)

Bry*_*e S 5

您的 HTTP 正文将通过 lambda 作为event['body'].

另外,我认为您需要使用 .json 解析正文的 JSON 字符串json.loads

最后,我看到你的 HTML 正在做一个GET方法,你可能想要解决这个问题:

<form method="POST" action="https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser">

Run Code Online (Sandbox Code Playgroud)

无服务器是 lambda 函数的重要资源。以下是他们可能适用于您的情况的示例:

https://github.com/serverless/examples/blob/master/aws-python-rest-api-with-dynamodb/todos/create.py

  • 当我使用 post 时,我总是收到此错误。“SyntaxError:JSON.parse:JSON 数据第 1 行第 74 列的转义字符错误” (2认同)

D3v*_*dom 3

解决了:

我发现由于字符串格式的原因,直接发布到 AWS Lambda 不起作用。AWS Lambda 需要使用 JSON.stringify() 的 JSON 格式。

        <form onsubmit="submitData();return false;">
            <label for="Username">Username:</label><br>
            <input type="text" id="Username" name="Username" value=""><br>
            <label for="password">Password:</label><br>
            <input type="text" id="Password" name="Password" value=""><br><br>
            <input type="submit" id="submit" value="Submit" >
        </form>
Run Code Online (Sandbox Code Playgroud)
            function submitData() {
                var user = document.getElementById("Username").value
                var pass = document.getElementById("Password").value
                var json = { Username: user, Password: pass };
                $.ajax({
                    type: "POST",
                    url: "https://fake.execute-api.us-east-1.amazonaws.com/Prod/RegisterUser",
                    data: JSON.stringify(json),
                    beforeSend: function() { 
                        console.log("Before");
                        $("#submit").attr('disabled', true);
                    },
                    success: function(response){ 
                        console.log(response);
                        $("#submit").attr('disabled', false);
                    }
                });
            }
Run Code Online (Sandbox Code Playgroud)
import pymysql
import json

def lambda_handler(event, context):
   resp = event
   return {
      "Username:": resp["Username"],
      "Password": resp["Password"]
   }
Run Code Online (Sandbox Code Playgroud)