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

如何使用urllib3实现与urllib2一致的请求数据传输效果?

使用urllib3实现与urllib2一致的请求输出

核心问题在于:Python2的urllib2直接将JSON字符串作为原始请求体发送,而你之前的Python3代码错误地对字典执行了URL编码,导致请求格式与原逻辑不符。用urllib3实现一致效果,需要直接发送JSON格式的字节数据,并配置正确的请求头。

实现代码示例

import urllib3
import json

# 方式1:直接复用Python2的JSON字符串写法
reqdata = '{"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}}'

# 方式2:从字典转换为JSON字符串(更易维护)
# reqdata_dict = {"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}}
# reqdata = json.dumps(reqdata_dict)

# 将字符串编码为字节类型,符合urllib3的请求体要求
data_bytes = reqdata.encode('utf-8')

# 创建urllib3的连接池管理器
http = urllib3.PoolManager()

# 发送POST请求,指定JSON格式的请求体和对应的Content-Type头
response = http.request(
    'POST',
    f'http://{ipaddress}/lala.cgi',
    body=data_bytes,
    headers={'Content-Type': 'application/json'}
)

# 解析响应内容
response_content = response.data.decode('utf-8')
print(response_content)

关键注意点

  • 避免URL编码:不要对字典使用urlencode,该方法是用于生成application/x-www-form-urlencoded格式的表单数据,与原逻辑的JSON格式不符。
  • 显式设置Content-Type:虽然Python2的urllib2未显式设置,但服务端大概率是按JSON解析请求体,显式设置application/json头能确保兼容性。
  • 编码一致性:用utf-8编码JSON字符串,和Python2中字节串的默认编码行为保持一致。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:47:14