Requests库:如何在params中传递符合API要求的布尔值?
解决URL参数布尔值小写转换问题
Requests库处理URL查询参数(params)时,默认会用Python原生的str()方法转换布尔值,所以True会变成"True",False变成"False",这和你需要的JSON风格小写字符串不匹配。不用手动逐个转换,有几种更优的方法:
方法1:自定义参数编码器
通过继承requests.models.PreparedRequest重写参数编码逻辑,统一处理布尔值:
import requests from urllib.parse import quote class LowercaseBoolEncoder(requests.models.PreparedRequest): def encode_params(self, params): if not params: return '' encoded = [] for key, value in params.items(): # 仅处理布尔值,转成小写字符串 if isinstance(value, bool): value = str(value).lower() encoded.append(f"{quote(str(key))}={quote(str(value))}") return '&'.join(encoded) # 用自定义编码器的Session发送请求 session = requests.Session() session.prepare_request = LowercaseBoolEncoder request_parameters = { "headers": myheaders, "params": {"myparam": True} } response = session.get(myurl, **request_parameters)
这个方法一劳永逸,之后所有通过该Session发送的请求,布尔参数都会自动转小写。
方法2:递归转换参数字典
写个简单函数递归处理参数里的所有布尔值,适合参数嵌套较复杂的场景:
def convert_bool_to_lower(param): if isinstance(param, dict): return {k: convert_bool_to_lower(v) for k, v in param.items()} elif isinstance(param, bool): return str(param).lower() return param # 预处理参数 processed_params = convert_bool_to_lower({"myparam": True, "nested": {"active": False}}) response = requests.get(myurl, headers=myheaders, params=processed_params)
这种方式直观,只修改布尔值,不影响其他类型参数的处理。
方法3:手动编码URL参数
用urllib.parse.urlencode手动控制编码逻辑,适合参数结构简单的情况:
from urllib.parse import urlencode params = {"myparam": True} # 转换布尔值后编码 encoded_params = urlencode({ k: str(v).lower() if isinstance(v, bool) else v for k, v in params.items() }) full_url = f"{myurl}?{encoded_params}" response = requests.get(full_url, headers=myheaders)
另外要明确:Requests的params参数是用于URL查询字符串的,不会自动转成JSON格式——JSON转换是用于请求体(比如requests.post(url, json=params))的逻辑,和URL参数的编码规则完全不同。
内容的提问来源于stack exchange,提问作者user1383029
相关产品推荐
相关产品推荐

