Python中PUT请求传递字典字符串列表遇TypeError问题咨询
解决urllib PUT请求的TypeError问题
嗨,这个错误其实很好解决,核心原因就是urllib.request.Request要求请求体数据必须是字节类型(bytes),而你用json.dumps()生成的是字符串,所以触发了类型错误。咱们一步步把代码改对:
1. 先把JSON字符串转成字节流
json.dumps()会把Python对象转成JSON格式的字符串,但urllib不认这个,得用encode('utf-8')把它变成字节流:
myData = json.dumps(list1).encode('utf-8')
2. 简化PUT请求的写法
你用lambda修改请求方法的方式虽然能用,但Python 3.3+之后,Request构造函数直接支持method参数,写起来更清爽:
myRestRequestObj = urllib.request.Request(url, myData, method='PUT')
3. 修复Authorization头的问题
你代码里的Authorization: Basic %s是个占位符,实际需要传入base64编码的用户名+密码字符串。比如你的用户名是admin,密码是123456,得这么处理:
import base64 # 先把用户名密码拼成"user:pass"的字节串,再base64编码,最后转成字符串 auth_str = base64.b64encode(b"admin:123456").decode('utf-8') myRestRequestObj.add_header('Authorization', f'Basic {auth_str}')
修正后的完整代码
import json import urllib.request import urllib.error import base64 # 直接用字典列表,比字符串列表更易维护 list1 = [ {"id": "", "email": "John@fullcontact.com", "fullName": "John Lorang"}, {"id": "", "email": "Lola@fullcontact.com", "fullName": "Lola Dsilva"} ] # 序列化为JSON并转成字节流 myData = json.dumps(list1).encode('utf-8') # 直接指定PUT方法创建请求 myRestRequestObj = urllib.request.Request(url, myData, method='PUT') myRestRequestObj.add_header('Content-Type', 'application/json') # 替换成你的实际认证信息 username = "your_username" password = "your_password" auth_encoded = base64.b64encode(f"{username}:{password}".encode('utf-8')).decode('utf-8') myRestRequestObj.add_header('Authorization', f'Basic {auth_encoded}') try: response = urllib.request.urlopen(myRestRequestObj) # 可以读取并打印响应内容 print(response.read().decode('utf-8')) except urllib.error.URLError as e: print(e.reason)
额外小提示
- 你原来的
list1是字符串组成的列表,其实直接用Python字典列表更靠谱,json.dumps会自动帮你转成正确的JSON数组,不容易写错引号。 - 记得确认你的目标API确实支持PUT请求,并且接受
application/json格式的请求体哦。
内容的提问来源于stack exchange,提问作者hgd2703
相关产品推荐
相关产品推荐

