Python对AWS API网关的“请求”与“urllib3”

2024-09-30 00:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python程序,它调用awsapi网关来访问dynamoDB

当我使用python“请求”时,一切都很好: r=请求。post(“https://xxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/log-entries", 数据={'logbookTimestamp':时间戳,'Name':“Fred”})

现在,为了将其作为lambda函数运行,我想使用“urllib3”而不是“requests” 因为urllib3默认包含在lambda的python中。因此,现在我正尝试对urllib3执行同样的操作,但无法使其工作。我已经在这里阅读了urllib3用户指南(https://urllib3.readthedocs.io/en/latest/user-guide.html#json),它说我需要在发送JSON数据之前对其进行编码,所以我做到了:

http = urllib3.PoolManager()
fields = {'logbookTimestamp': timestamp, 'Name': "Fred"}
encoded_fields = json.dumps(fields).encode('utf-8')
link = "https://xxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/log-entries"
r = http.request('POST',
                 link,
                 body=encoded_fields,
                 headers={'Content-Type': 'application/json'}
                 )

当我在CloudWatch中查看两者的输出时,我发现数据的格式不同

根据请求: (c084a37e-43d8-464a-9dcf-E40C28922CE)转换前的方法请求正文:logbookTimestamp=2020%3A12%3A15%3A20%3A11%3A02&;姓名=弗雷德

使用urllib3: (9b8d84e9-2403-462c-b25f-945a927d1e66)转换前的方法请求正文: { “日志时间戳”:“2020:12:15:21:31:21”, “姓名”:“弗雷德” }

并返回以下内容: (9b8d84e9-2403-462c-b25f-945a927d1e66)转换前的端点响应体: { “状态代码”:500, “标题”:{ “内容类型”:“文本/html;字符集=utf-8”, “内容长度”:“290” }, “正文”:“\n500内部服务器错误\n

内部服务器错误

\n

服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。

\n” } (9b8d84e9-2403-462c-b25f-945a927d1e66)转换前的端点响应正文:{“状态码”:500,“标题”:{“内容类型”:“文本/html;字符集=utf-8”,“内容长度”:“290”}

我不知道如何以“urllib3”的格式获取数据,就像接受“请求”一样。有什么想法吗?谢谢


Tags: 数据https服务器apijson内容fieldsexecute
1条回答
网友
1楼 · 发布于 2024-09-30 00:34:47

如果您在requests中以data的形式发布json,它将像html表单一样提交:

"Content-Type":["application/x-www-form-urlencoded"]

如果你想让它变成json,你应该使用

requests.post("https://xxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/log-entries", json={'logbookTimestamp': timestamp, 'Name': "Fred"})

其提交的数据如下:

"Content-Type":["application/json"]

相关问题 更多 >

    热门问题