使用urllib3 PoolManager.request()时遇'unexpected keyword json'错误
问题排查与解决方案
核心原因
AWS Lambda默认预装的urllib3版本低于v1.26.0,而PoolManager.request()方法的json参数是在v1.26.0版本才新增的特性。旧版本不识别该参数,因此会抛出TypeError;但请求能返回202状态码,是因为urllib3在抛出错误前已经完成了HTTP请求的发送流程。
解决方法
方法1:手动构造JSON请求体(兼容所有版本)
放弃使用json参数,改为手动设置请求头并传入JSON字符串格式的请求体:
import json import urllib3 def lambda_handler(event, context): http = urllib3.PoolManager() payload = {"key": "value"} response = http.request( "POST", "https://your-target-api.com/endpoint", body=json.dumps(payload), headers={"Content-Type": "application/json"} ) print(response.status) return {"statusCode": response.status}
方法2:升级Lambda中的urllib3版本
如果一定要使用json参数,需在部署包中打包新版本的urllib3:
- 本地创建项目目录,执行命令
pip install urllib3 -t .,将最新版urllib3下载到当前目录 - 将你的Lambda代码与下载的urllib3文件夹一起打包为ZIP包
- 在AWS Lambda控制台上传该ZIP包作为部署包
- 之后即可正常使用
json参数:
import urllib3 def lambda_handler(event, context): http = urllib3.PoolManager() payload = {"key": "value"} response = http.request( "POST", "https://your-target-api.com/endpoint", json=payload ) print(response.status) return {"statusCode": response.status}
额外说明
你之前使用json.dumps转换后仍报错,是因为错误根源是旧版本urllib3根本没有json这个参数定义,和你传入的是字符串还是字典无关——只要传了json关键字参数就会触发TypeError。
内容的提问来源于stack exchange,提问作者Jason Michael
相关产品推荐
相关产品推荐

