合并900+请求调用服务器触发414 URL过长错误,求解决方案
解决URL过长(错误码414)的方案
方法1:改用POST请求传递参数
GET请求参数拼接在URL中,受服务器/浏览器长度限制严格,换成POST请求将参数放在请求体里,就能避开这个限制,这类监控类API基本都支持POST方式。
修改后的代码示例:
# 把请求参数整理成字典 payload = { 'metricSelector': metricURL, 'resolution': 'Inf', 'from': '2022-12-01 00:00:00', 'to': '2022-12-14 16:13:00' } # 用POST发送请求 value = requests.post( '你不能展示的URL', json=payload, headers={'accept': 'application/json; charset=utf-8', 'Authorization': 'Api-Token ...'}, verify=False )
方法2:批量拆分请求
如果服务器不支持POST,就把900个指标拆分成多个小批次调用。先测试出单次能承载的最大指标数(比如从30逐步往上试),再分批次请求并合并结果。
示例代码:
batch_size = 50 # 替换成你测试出的单次最大安全数量 total_metrics = len(jsoncalc["metrics"]) # 按批次循环处理 for start_idx in range(0, total_metrics, batch_size): end_idx = min(start_idx + batch_size, total_metrics) batch_metrics = jsoncalc["metrics"][start_idx:end_idx] metricURL = '' for metric in batch_metrics: metricaI = metric["metricId"] metricURL += 'builtin:billing.ddu.metrics.byMetric:filter(and(or(eq("Metric Key","{}")))):splitBy("Metric Key"):sort(value(auto,descending)),'.format(metricaI) metricURL = metricURL.rstrip(',') # 移除末尾多余的逗号 # 发起当前批次的GET请求 response = requests.get( '你不能展示的URL?metricSelector={}&resolution=Inf&from=2022-12-01 00:00:00&to=2022-12-14 16:13:00'.format(metricURL), headers={'accept': 'application/json; charset=utf-8', 'Authorization': 'Api-Token ...'}, verify=False ) # 这里添加处理当前批次响应的逻辑,比如把结果合并到总数据中 # process_response(response.json())
方法3:优化metricSelector的写法
你当前的写法是每个指标单独生成一段重复的selector,其实可以把所有指标合并到同一个filter条件里,大幅缩短URL长度。
原来每个指标重复了大量前缀后缀,合并后只需要写一次主体结构,把所有Metric Key放到同一个or条件中即可。
示例代码:
# 提取所有指标ID all_metric_ids = [metric["metricId"] for metric in jsoncalc["metrics"]] # 构建合并后的filter子句 filter_parts = ','.join(f'eq("Metric Key","{mid}")' for mid in all_metric_ids) # 生成精简后的metricSelector metricURL = f'builtin:billing.ddu.metrics.byMetric:filter(and(or({filter_parts}))):splitBy("Metric Key"):sort(value(auto,descending))' # 发起请求 value = requests.get( '你不能展示的URL?metricSelector={}&resolution=Inf&from=2022-12-01 00:00:00&to=2022-12-14 16:13:00'.format(metricURL), headers={'accept': 'application/json; charset=utf-8', 'Authorization': 'Api-Token ...'}, verify=False )
这种方式能把URL长度压缩到原来的几分之一,大概率能符合GET请求的长度限制。
内容的提问来源于stack exchange,提问作者Giampiero58
相关产品推荐
相关产品推荐

