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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:09