首页 > 解决方案 > 亚马逊 lambda 函数不接受帖子

问题描述

测试我的 lambda 函数时收到此错误消息。

 {
  "errorMessage": "the JSON object must be str, bytes or bytearray, not list",
  "errorType": "TypeError",
  "stackTrace": [
    "  File \"/var/task/handler.py\", line 90, in send_friend_request\n    payload = json.loads(event['body'])\n",
    "  File \"/var/lang/lib/python3.7/json/__init__.py\", line 341, in loads\n    raise TypeError(f'the JSON object must be str, bytes or bytearray, '\n"
  ]
}

它抱怨的行是:

payload = json.loads(event['body'])

这是功能:

def accept_friend_request(event, context):

    payload = json.loads(event['body'])

    request_id = payload['request_id']
    fromUsername = payload['fromUsername']
    toUsername = payload['toUsername']

我寄给儿子的格式是:

{
  "body": [
    {
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
    }
  ]
}

我尝试过其他格式来发送儿子,例如:

{
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
}

但这也会引发错误:

{
  "errorMessage": "'body'",
  "errorType": "KeyError",
  "stackTrace": [
    "  File \"/var/task/handler.py\", line 90, in send_friend_request\n    payload = json.loads(event['body'])\n"
  ]
}

我真的不知道该怎么做。我是以错误的格式发送儿子还是我接受了 json.loads 错误?

标签: pythonaws-lambda

解决方案


json.loads()接收字符串作为参数并将其转换为 python 对象(列表/字典)。

您的代码中的问题event["body"]已经是 python 对象(列表,根据您共享的错误)。正如 AWS Lambda 文档中提到的 Python 事件处理函数:

event – AWS Lambda uses this parameter to pass in event data to the handler. This parameter is usually of the Python dict type. It can also be list, str, int, float, or NoneType type

所以你不需要用json.loads()它来解析成python对象。你可以做:

# For the following event:
{
  "body": [
    {
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
    }
  ]
}

def accept_friend_request(event, context):
    request_id = context.aws_request_id
    payload = event['body']
    fromUsername = payload[0]['fromUsername']
    toUsername = payload[0]['toUsername']

推荐阅读