【问题标题】:Python "requests" vs "urllib3" to AWS API GatewayPython“请求”与“urllib3”到 AWS API Gateway
【发布时间】:2021-03-30 06:05:08
【问题描述】:

我正在编写一个调用 AWS API Gateway 来访问 dynamoDB 的 python 程序。

当我使用 python“请求”时,一切正常: r = requests.post("https://xxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/log-entries", data={'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-e40c28922ece) 转换前的方法请求正文:logbookTimestamp=2020%3A12%3A15%3A20%3A11%3A02&Name=Fred

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

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

内部服务器错误

\n

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

\n" } (9b8d84e9-2403-462c-b25f-945a927d1e66) 转换前的端点响应正文:{"statusCode": 500, "headers": {"Content-Type": "text/html; charset=utf-8", "Content-长度”:“290”}

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

【问题讨论】:

  • 你试过没有.encode('utf-8')吗?
  • 我试过了,但还是没有运气。不过谢谢!

标签: python amazon-web-services aws-api-gateway


【解决方案1】:

如果您在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"]

【讨论】:

  • 谢谢。但是,我对“请求”的工作方式很好。我正在寻求从“urllib3”获得相同结果的帮助。问候,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多