如何使用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
相关产品推荐
相关产品推荐

