AWS Lambda 在表单事件输入中添加引号 [重复]

Posted

技术标签:

【中文标题】AWS Lambda 在表单事件输入中添加引号 [重复]【英文标题】:AWS Lambda adds quotes to form event input [duplicate] 【发布时间】:2020-11-10 11:04:39 【问题描述】:

我有一个 Python 3.8 AWS Lambda 函数,它接收来自 Web 应用程序的表单输入。来自表单输入的数据传递到 Lambda 函数并位于事件字典中。问题是 lambda 不将其识别为表格并将其转换为字符串。我的 JS 和 Python 代码如下。

    function addPart(partName) 
        var raw = JSON.stringify('partName':partName);
        $.ajax(
            method: 'POST',
            url: "Insert URL Here", // I have a real (working) invoke URL here
            headers: 
                Authorization: authToken
            ,
            body: raw,
            contentType: 'application/json',
            success: completeRequest,
            error: function ajaxError(jqXHR, textStatus, errorThrown) 
                console.error('Error requesting ride: ', textStatus, ', Details: ', errorThrown);
                console.error('Response: ', jqXHR.responseText);
                alert('An error occured when adding your part:\n' + jqXHR.responseText);
            
        );
    
import boto3
import json

dynamodb = boto3.resource('dynamodb')

UniqueUser = "test"
partName = "default"

def lambda_handler(event, context):
    UniqueUser = event['requestContext']['authorizer']['claims']['sub']
    partName = event['partName']
    # partName = event['body']['partName']  
    table = dynamodb.Table('Parts')
    response = table.put_item(
       Item=
            'UserID': UniqueUser,
            'PartName': partName
        
    )
    print(event)
    return 
        'statusCode': 200,
        'headers': 
            'Access-Control-Allow-Origin': '*'
        ,
        'body': json.dumps(partName)
    

这是对print(event) 行的响应的相关部分。问题是,尽管被格式化为 Python 库,但它是在引号中并充当字符串。有谁知道如何解决这个问题?

'body': '"partName":"test"'

【问题讨论】:

在你的回报中使用'body': partName 您正在发送 JSON。 JSON 是一个字符串,是的。你需要解析它。 【参考方案1】:

在你的lambda_handler 你有

 'body': json.dumps(partName)

由于partName 可能是"partName":"test",所以json.dumps 函数会将您的partName 序列化为str,结果 在'"partName":"test"'

为避免这种情况,您可以直接返回partName

    return 
        'statusCode': 200,
        'headers': 
            'Access-Control-Allow-Origin': '*'
        ,
        'body': partName
    

另一种方法是在客户端的JS中使用JSON.parse来反序列化json字符串。

【讨论】:

【参考方案2】:

我使用 deceze 的评论建议解决了这个问题,并将其解析为字典。这是我解析它的代码:

dictString = event['body']
attributeDict = ast.literal_eval(dictString)
partName = attributeDict["partName"]

【讨论】:

使用json.loads()!这是 JSON!

以上是关于AWS Lambda 在表单事件输入中添加引号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?

通过 cloudformation 的 AWS Lambda 计划事件源

Aws Lambda 收集 CloudWatch 事件

AWS Amazon Connect Lambda输入请求架构

在AWS s3中保存图像

在CDK中通过ARN将事件源添加到Lambda