pin_drop当前位置:知识文库 ❯ 图文
requests库请求参数详解 - params、data与json用法指南
一、概述
HTTP请求参数是客户端向服务器传递数据的重要方式。Python的requests库支持多种参数传递方式:params用于URL查询字符串参数,data用于表单格式的请求体,json用于JSON格式的请求体。理解不同参数类型的使用场景和传递方式,是正确使用requests库的关键。
正确选择参数传递方式,不仅关系到请求是否成功,还直接影响数据传输的效率和服务器的解析方式。
二、语法与参数说明
基本语法
代码示例
import requests
# URL查询参数(拼接到URL后面)
requests.get(url, params=dict)
# 表单数据(放在请求体中)
requests.post(url, data=dict)
# JSON数据(放在请求体中,自动序列化)
requests.post(url, json=dict)参数说明
params参数格式
三、URL查询参数(params)
params参数用于在GET请求中向URL添加查询字符串。requests会自动将参数字典转换为URL编码格式并追加到URL后面。例如,{'q': 'Python', 'page': 1}会被转换为?q=Python&page=1。
data参数用于POST请求中发送表单格式的数据,Content-Type默认设为application/x-www-form-urlencoded。而json参数则会自动将字典序列化为JSON字符串,并设置Content-Type为application/json。
四、代码示例
示例1:URL查询参数的各种用法
代码示例
import requests
# 方式1:字典参数(最常用)
params1 = {'q': 'Python', 'page': 1, 'limit': 10}
response1 = requests.get('https://httpbin.org/get', params=params1)
print(f"字典参数URL: {response1.json()['url']}")
# 方式2:多值参数(同一键多个值)
params2 = {'tag': ['web', 'python', 'api']}
response2 = requests.get('https://httpbin.org/get', params=params2)
print(f"多值参数: {response2.json()['args']}")
# 方式3:元组列表参数(可传递重复键)
params3 = [('sort', 'date'), ('sort', 'relevance')]
response3 = requests.get('https://httpbin.org/get', params=params3)
print(f"元组列表参数: {response3.json()['args']}")输出:
代码示例
字典参数URL: https://httpbin.org/get?q=Python&page=1&limit=10
多值参数: {'tag': ['web', 'python', 'api']}
元组列表参数: {'sort': ['date', 'relevance']}示例2:请求体参数(data与json)
代码示例
import requests
# data参数:表单格式(application/x-www-form-urlencoded)
form_data = {'username': 'admin', 'password': '123456'}
response1 = requests.post('https://httpbin.org/post', data=form_data)
result1 = response1.json()
print(f"data参数Content-Type: {result1['headers'].get('Content-Type')}")
print(f"data参数数据: {result1['form']}")
# json参数:JSON格式(application/json)
json_data = {'username': 'admin', 'password': '123456'}
response2 = requests.post('https://httpbin.org/post', json=json_data)
result2 = response2.json()
print(f"json参数Content-Type: {result2['headers'].get('Content-Type')}")
print(f"json参数数据: {result2['json']}")输出:
代码示例
data参数Content-Type: application/x-www-form-urlencoded
data参数数据: {'username': 'admin', 'password': '123456'}
json参数Content-Type: application/json
json参数数据: {'username': 'admin', 'password': '123456'}示例3:参数编码与特殊字符处理
代码示例
import requests
# 中文参数自动URL编码,无需手动处理
params = {
'keyword': 'Python编程',
'filter': '价格>100',
'sort': 'desc',
'empty': '', # 空值
'special': 'a&b=1' # 特殊字符
}
response = requests.get('https://httpbin.org/get', params=params)
result = response.json()
print(f"编码后URL: {response.url}")
print(f"服务器收到参数: {result['args']}")
print(f"中文解码: {result['args']['keyword']}")输出:
代码示例
编码后URL: https://httpbin.org/get?keyword=Python%E7%BC%96%E7%A8%8B&filter=%E4%BB%B7%E6%A0%BC%3E100&sort=desc&empty=&special=a%26b%3D1
服务器收到参数: {'keyword': 'Python编程', 'filter': '价格>100', 'sort': 'desc', 'empty': '', 'special': 'a&b=1'}
中文解码: Python编程五、实际应用场景
-
场景1:搜索引擎API调用:通过params传递关键词、分页、排序等查询条件。例如调用百度搜索API时,params可以包含wd(关键词)、pn(页码)、rn(每页数量)等参数。
-
场景2:用户注册接口:通过json参数提交用户信息(用户名、密码、邮箱等),服务器验证后返回注册结果。现代Web API普遍采用JSON格式进行数据交互。
-
场景3:数据筛选功能:通过URL参数传递筛选条件,支持多条件组合查询。例如电商网站的商品搜索:分类、价格区间、品牌、排序方式等都可通过params传递。
六、注意事项
注意1:params中的中文和特殊字符会自动进行URL编码,无需手动调用urllib.parse.quote。requests内部使用urllib3的编码功能自动处理。
注意2:data参数传递字典时,值为None的键会被忽略;传递字符串时不会自动编码,需要确保格式正确。
注意3:params参数中布尔值True会被转为字符串"True",需注意服务器端的类型解析。建议在传参前将布尔值转换为服务器期望的格式(如1/0或true/false字符串)。
七、参数传递方式对比
不同的参数传递方式适用于不同的场景,选择合适的传递方式是确保API调用成功的关键:
小贴士
虽然requests.post(url, json=data)和requests.post(url, data=json.dumps(data), headers={'Content-Type': 'application/json'})效果相同,但使用json参数更加简洁,无需手动调用json.dumps()和设置Content-Type,推荐优先使用json参数。
八、小结
-
params参数用于URL查询字符串,自动编码中文和特殊字符,适合GET请求。
-
data参数发送表单格式数据,json参数发送JSON格式数据,适合POST/PUT请求。
-
多值参数可通过列表或元组列表传递,支持同一键对应多个值。
-
选择参数类型需根据API文档要求和HTTP方法语义决定,不要随意混用。
九、练习题
练习1
使用params参数向 https://httpbin.org/get 发送搜索请求,包含关键词(q)、页码(page)和每页数量(limit)三个参数。
练习2
分别使用data和json参数发送相同的数据(用户名和密码),对比Content-Type和服务器接收到的数据位置(form vs json)的差异。
练习3
编写程序,传递包含中文、空格、特殊字符(如&、=、#)的参数,验证requests的自动编码功能。
常见问题
1. params和data可以同时使用吗?
可以。params参数会拼接到URL查询字符串中,data参数放在请求体中。两者互不干扰,可以同时使用。例如:requests.post(url, params={'page': 1}, data={'name': 'test'})。
2. data和json参数有什么区别?
data参数会将字典编码为表单格式(key=value&key2=value2),Content-Type为application/x-www-form-urlencoded;json参数会将字典序列化为JSON字符串,Content-Type为application/json。现代API推荐使用json参数。
3. 如何传递嵌套的JSON数据?
使用json参数可以直接传递包含嵌套字典或列表的数据:requests.post(url, json={'user': {'name': 'Alice'}, 'tags': ['admin', 'user']})。requests会自动将其序列化为正确的JSON格式。
4. params中如何处理空值?
值为空字符串的键会被包含在URL中(?key=),值为None的键会被忽略不发送。如果不想发送某个参数,最好从字典中删除该键,而不是设置为None。
本文涉及AI创作
内容由AI创作,请仔细甄别