Python实现根据字典参数组合动态拼接API请求URL字符串
动态生成多筛选条件组合API URL实现方案
需求说明
给定基础API地址:https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500
需要根据传入的筛选条件字典,自动生成所有参数笛卡尔积组合对应的完整请求URL,要求兼容任意数量的筛选键,不能硬编码参数名。
示例筛选字典:
criteria = {'city':["Mumbai","Delhi"], 'polutant_id': ["PM10", "NO2"]}
最终需要输出4条拼接完成的URL,格式和如下预期一致:
"https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500&filters[city]=Mumbai&filters[polutant_id]=PM10" "https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500&filters[city]=Delhi&filters[polutant_id]=PM10" "https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500&filters[city]=Mumbai&filters[polutant_id]=NO2" "https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500&filters[city]=Delhi&filters[polutant_id]=NO2"
实现代码
你之前写的笛卡尔积生成逻辑是可行的,不需要硬编码参数前缀列表,遍历每一组参数组合动态拼接筛选片段即可,这里给两个版本,第一个是去掉pandas依赖的轻量版本,性能更好:
import itertools # 基础配置 base_url = "https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500" criteria = {'city':["Mumbai","Delhi"], 'polutant_id': ["PM10", "NO2"]} # 提取所有筛选键,生成参数值的笛卡尔积组合 param_keys = list(criteria.keys()) param_combinations = itertools.product(*criteria.values()) result = [] for combo in param_combinations: filter_segment = "" # 逐个拼接当前组合的筛选参数 for k, v in zip(param_keys, combo): filter_segment += f"&filters[{k}]={v}" # 拼接完整URL并加上预期的双引号包裹 full_url = f'"{base_url}{filter_segment}"' result.append(full_url) # 打印验证输出 for url in result: print(url)
如果你要沿用之前写的pandas版expand_grid函数,拼接逻辑如下:
import pandas as pd import itertools def expand_grid(data_dict): rows = itertools.product(*data_dict.values()) return pd.DataFrame.from_records(rows, columns=data_dict.keys()) # 基础配置 base_url = "https://api.xxx.com/resource/xxx?api-key=xxx&format=json&limit=500" criteria = {'city':["Mumbai","Delhi"], 'polutant_id': ["PM10", "NO2"]} criteriaAll = expand_grid(criteria) result = [] for _, row in criteriaAll.iterrows(): filter_segment = "" for k in criteria.keys(): filter_segment += f"&filters[{k}]={row[k]}" full_url = f'"{base_url}{filter_segment}"' result.append(full_url)
优化提示
- 上述代码完全兼容任意数量的筛选键:不管
criteria里有2个、3个还是更多键,每个键对应多少个可选值,都能自动生成所有组合的URL,不需要修改逻辑 - 如果参数值包含特殊字符(中文、空格、符号等),引入
urllib.parse.quote对参数值做URL编码,避免请求格式错误,拼接时替换为如下写法即可:from urllib.parse import quote filter_segment += f"&filters[{k}]={quote(str(v))}"
内容的提问来源于stack exchange,提问作者Ujjawal Bhandari
相关产品推荐
相关产品推荐

