如何从英国空气质量公开API获取JSON数据并创建新端点重命名字段
最优解决方案:第三方空气质量API代理与数据转换
刚好之前做过类似的第三方API代理转换需求,给你分享几个落地性强的方案,适配不同技术栈场景:
方案1:Node.js + Express(轻量快速,前端/全栈团队首选)
这是最常用的轻量方案,用Express搭建新API端点,通过Axios请求第三方数据后做转换:
步骤&代码示例
- 安装依赖:
npm install express axios
- 编写API服务:
const express = require('express'); const axios = require('axios'); const app = express(); // 自定义API端点,供你的第三方系统调用 app.get('/transformed-air-quality', async (req, res) => { try { // 1. 请求英国空气质量公开API(这里替换成你实际用的API地址) const rawResponse = await axios.get('https://api.erg.ic.ac.uk/AirQuality/Data/SiteSpecies/SiteCode=MY1/SpeciesCode=NO2/json', { timeout: 5000 // 加超时避免阻塞 }); // 2. 核心数据转换逻辑:重命名字段+丢弃冗余 const transformedData = { Weather: rawResponse.data.data.flatMap(item => [ { newName: item.intensity.forecast }, { newName2: item.intensity.actual } ]) }; // 3. 返回转换后的数据给对接系统 res.json(transformedData); } catch (error) { // 友好的错误处理,避免暴露第三方API细节 const errorMsg = error.response?.status ? `Third-party API error: ${error.response.status}` : 'Failed to fetch or process air quality data'; res.status(500).json({ error: errorMsg }); } }); // 启动服务 app.listen(3000, () => { console.log('Transformed air quality API running on http://localhost:3000'); });
方案优势
- 代码简洁易维护,转换逻辑直观
- 可快速添加缓存层(比如用
node-cache),减少重复请求第三方API,提升响应速度 - 适合小团队快速落地
方案2:Python + Flask(Python技术栈首选)
如果你的团队用Python,Flask/Django是很好的选择,下面是Flask的实现示例:
步骤&代码示例
- 安装依赖:
pip install flask requests
- 编写API服务:
from flask import Flask, jsonify import requests app = Flask(__name__) @app.route('/transformed-air-quality') def transformed_air_quality(): try: # 请求第三方API raw_response = requests.get( 'https://api.erg.ic.ac.uk/AirQuality/Data/SiteSpecies/SiteCode=MY1/SpeciesCode=NO2/json', timeout=5 ) raw_response.raise_for_status() # 主动抛出HTTP错误 raw_data = raw_response.json() # 数据转换 transformed = {"Weather": []} for item in raw_data['data']: transformed['Weather'].append({"newName": item['intensity']['forecast']}) transformed['Weather'].append({"newName2": item['intensity']['actual']}) return jsonify(transformed) except requests.exceptions.RequestException as e: return jsonify({"error": f"Failed to fetch data: {str(e)}"}), 500 except KeyError as e: return jsonify({"error": f"Data format mismatch: Missing field {str(e)}"}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
方案优势
- Python处理JSON和数据映射灵活,适合复杂转换逻辑
- 如果是大型项目,可无缝切换到Django REST Framework,做更规范的API管理
通用优化建议(必做)
- 配置化字段映射:把原始字段和目标字段的对应关系抽成配置文件/字典,比如:
后续修改字段无需改动核心转换逻辑,维护性拉满const fieldMapping = { 'intensity.forecast': 'newName', 'intensity.actual': 'newName2' }; - 添加缓存:第三方空气质量数据更新频率不高,用Redis或内存缓存缓存结果,比如每15分钟刷新一次,大幅降低第三方API调用量
- 参数验证:如果你的API需要接收日期、站点等参数,先做合法性校验,避免无效请求发送给第三方API
- 监控告警:给API加基础监控(比如请求成功率、响应时间),避免第三方API故障影响你的对接系统
内容的提问来源于stack exchange,提问作者onclebenz
相关产品推荐
相关产品推荐

