Python requests POST请求传header触发AttributeError求助
问题根因
报错AttributeError: 'set' object has no attribute 'items'和引号类型没有任何关系,核心是你传入的header、data参数类型错误:
- Python语法中,花括号
{}包裹的内容如果是键: 值形式的键值对,才是字典类型;如果只是逗号分隔的独立值,会被识别为集合(set)类型。 - 你写的
header里,把每个请求头的键和值拼成了一整段字符串(比如'Content-Type: application/x-www-form-urlencoded'是一个完整字符串,没有拆成键'Content-Type'、值'application/x-www-form-urlencoded'的键值对结构);data里也犯了同样的错误,把每个参数的键值拼成了单个字符串。这两个变量实际都是集合类型,不是requests要求的字典。 - requests处理headers、表单数据时,会调用字典自带的
.items()方法遍历所有键值对,集合类型没有这个方法,直接触发报错。你后来把所有表单参数拼成一整个字符串放在花括号里,本质还是构造了一个只有1个元素的集合,当然还是报同样的错。
正确代码
对照你提供的cURL逻辑,requests传字典给data参数时会自动处理application/x-www-form-urlencoded格式的urlencode,和cURL的--data-urlencode效果完全一致,不需要手动拼接参数串,正确写法如下:
import requests # 关闭verify=False时弹出的SSL警告,可选加 requests.packages.urllib3.disable_warnings() endpoint = 'https://api.website/v1/token' # headers为标准字典结构:键是请求头名称,值是请求头内容 headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Cache-Control': 'no-cache' } # data为标准字典结构:键是表单参数名,值是参数值,requests自动做编码处理 data = { 'username': '<YourUsername>', 'password': '<YourPassword>', 'grant_type': 'password', 'client_id': 'token-api' # 注意你原代码里client_id写的是api,和curl示例的token-api不一致,以接口实际要求为准 } resp = requests.post(endpoint, headers=headers, data=data, verify=False) # 打印响应状态码和内容调试 print(resp.status_code) print(resp.text)
补充说明
如果你一定要手动拼接&连接的表单字符串,直接把字符串传给data参数即可,不要套花括号:
data = 'username=<YourUsername>&password=<YourPassword>&grant_type=password&client_id=token-api'
这种写法也能正常发起请求,但手动拼接需要自行处理特殊字符的URL编码,遇到用户名、密码带特殊字符的情况容易出问题,传字典的方式更稳妥。
内容的提问来源于stack exchange,提问作者Kaze
相关产品推荐
相关产品推荐

