You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

  1. 本地创建项目目录,执行命令pip install urllib3 -t .,将最新版urllib3下载到当前目录
  2. 将你的Lambda代码与下载的urllib3文件夹一起打包为ZIP包
  3. 在AWS Lambda控制台上传该ZIP包作为部署包
  4. 之后即可正常使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:30:55