Python中API请求字符串编码问题:过滤昨日数据时请求报错
问题
需要从API请求中筛选仅昨日创建或更新的记录,API要求:
- 查询字符串需用双引号包裹
- 查询内容需URL编码
- 支持逻辑/关系运算符
使用Python的urllib.parse.quote编码查询字符串后,生成的URL格式不符合文档要求,返回400 Bad Request错误,无法保留双引号。
原代码:
import datetime as dt import urllib.parse import requests url = f".../api/v2/search/tickets" params={} yesterday = dt.date.today() - dt.timedelta(days = 1) query = urllib.parse.quote(f"created_at:>{yesterday} OR updated_at:>{yesterday}") params["query"] = query response = requests.get(url, auth=(api_key, "X"), params=params)
生成的请求URL:.../tickets?query=created_at%253A%253E%25272022-10-30%2527%2520OR%2520updated_at%253A%253E%25272022-10-30%2527
错误信息:requests.exceptions.HTTPError: 400 Client Error: Bad Request for url
解决方案
核心问题分析
- 重复编码:
requests.get会自动对params中的参数进行URL编码,手动用urllib.parse.quote编码后,导致参数被二次编码(比如%3A变成%253A),格式完全混乱。 - 未正确添加双引号:原代码未给查询条件加上双引号,不符合API要求。
- 错误的大于号写法:使用HTML转义的
>而非原生>符号,不符合API查询语法。
修正后的代码
import datetime as dt import requests url = ".../api/v2/search/tickets" params = {} yesterday = dt.date.today() - dt.timedelta(days=1) # 给查询条件包裹双引号,使用原生>符号,不手动编码 query = f'"created_at:>{yesterday} OR updated_at:>{yesterday}"' params["query"] = query # requests自动处理URL编码,无需手动操作 response = requests.get(url, auth=(api_key, "X"), params=params) # 可选:查看最终编码后的URL # print(response.url)
关键说明
- 直接构造带双引号的查询字符串,
requests会自动完成URL编码,正确保留双引号的编码格式("转为%22),同时处理其他特殊字符。 - 移除手动编码步骤,避免二次编码导致的格式错误。
- 使用原生
>替代HTML转义符,匹配API的查询语法规范。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

