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 dict/list/tuple/bytes None URL查询字符串参数,自动编码并拼接到URL后
data dict/list/tuple/bytes/file None 请求体数据,表单格式或原始数据
json dict None JSON格式请求体,自动序列化并设置Content-Type

params参数格式

格式 示例 生成的URL
字典 {'key': 'value'} ?key=value
列表元组 [('key1', 'v1'), ('key2', 'v2')] ?key1=v1&key2=v2
多值字典 {'key': ['v1', 'v2']} ?key=v1&key=v2
字符串 'key=value' ?key=value

三、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调用成功的关键:

方式 位置 格式 编码方式 适用HTTP方法 适用场景
params URL查询字符串 key=value URL编码 GET/DELETE 查询、筛选、分页
data 请求体 key=value URL编码 POST/PUT/PATCH 表单提交
json 请求体 {"key":"value"} JSON序列化 POST/PUT/PATCH API数据交互
路径参数 URL路径 /resource/{id} 手动拼接 所有方法 资源定位

小贴士

虽然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。

标签: requests 请求参数 URL编码 JSON Python教程 HTTP请求

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests库设置HTTP请求头 - User-Agent与Authorization详解 下一篇: requests Response对象详解 - 状态码解析与数据提取技巧

poll相关推荐