完整的数据接口调用过程
整体架构Thymeleaf页面 ↔ SpringBoot代理接口 ↔ 数据网关1. 前端层!DOCTYPE html html langzh-CN xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 title公共数据展示/title style body { padding: 30px; font-family: 微软雅黑; } button { padding: 8px 22px; font-size: 15px; cursor: pointer; } table { border-collapse: collapse; width: 90%; margin-top: 20px; } th,td { border:1px solid #ccc; padding:10px; text-align:center; } th { background:#f0f0f0; } .tip { color:#666; margin:10px 0; } .error { color:red; } /style /head body h3淄博公共开放数据查询天气预报/h3 div classtip button idqueryBtn查询7天天气/button /div div idresultBox/div script // WMO天气编码中文映射 const weatherMap { 0: 晴, 3: 多云, 51: 小雨/毛毛雨, 81: 阵雨 }; const queryBtn document.getElementById(queryBtn); const resultBox document.getElementById(resultBox); queryBtn.addEventListener(click, async (){ resultBox.innerHTML p classtip数据加载中.../p; try { // 调用后端代理接口天气接口无分页参数直接去掉page/start const res await fetch(/api/proxy/getW); const rawJson await res.json(); // 网关鉴权失败判断 if(rawJson.code ! 200){ resultBox.innerHTML p classerror接口调用失败${raw.msg}/p; return; } // 解析嵌套JSON字符串 const weatherData JSON.parse(rawJson.data); const daily weatherData.daily; // 拼接页面HTML let html p classtip 经度${weatherData.longitude}纬度${weatherData.latitude}时区${weatherData.timezone} /p table thead tr th日期/th th天气编码/th th天气/th th最高温℃/th th最低温℃/th /tr /thead tbody ; // 遍历日期数组渲染每行 daily.time.forEach((date, index) { const code daily.weathercode[index]; html tr td${date}/td td${code}/td td${weatherMap[code] || 未知天气}/td td${daily.temperature_2m_max[index]}/td td${daily.temperature_2m_min[index]}/td /tr ; }); html /tbody/table; resultBox.innerHTML html; }catch(err){ console.error(err); resultBox.innerHTML p classerror请求异常${err.message}/p; } }) /script /body /html2. SpringBoot后端代理层package demo.controller; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; import java.util.Base64; import java.util.UUID; import javax.net.ssl.*; RestController public class GatewayProxyController { private static final String CLIENT_ID 972ee8d6d************2e521520184; private static final String CLIENT_SECRET f8f4d09*********e395224ebd96; private static final String API_URL https://data.sd.gov.cn/gateway/api/1/get_W; private static final String HMAC_ALGORITHM HmacSHA256; // 静态禁用SSL校验仅本地调试 static { try { TrustManager[] trustAllCerts new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); HostnameVerifier allHostsValid (hostname, session) - true; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); } catch (Exception e) { e.printStackTrace(); } } GetMapping(/api/proxy/getW) public String proxyGetW() { try { String timestamp String.valueOf(System.currentTimeMillis()); String nonce UUID.randomUUID().toString(); String textToSign CLIENT_ID timestamp nonce; Mac mac Mac.getInstance(HMAC_ALGORITHM); SecretKeySpec key new SecretKeySpec(CLIENT_SECRET.getBytes(StandardCharsets.UTF_8), HMAC_ALGORITHM); mac.init(key); byte[] hmacData mac.doFinal(textToSign.getBytes(StandardCharsets.UTF_8)); String signature Base64.getEncoder().encodeToString(hmacData); URL url new URL(API_URL); HttpURLConnection conn (HttpURLConnection) url.openConnection(); conn.setRequestMethod(GET); conn.setConnectTimeout(10000); conn.setReadTimeout(10000); conn.setRequestProperty(X-Client-Id, CLIENT_ID); conn.setRequestProperty(X-Timestamp, timestamp); conn.setRequestProperty(X-Nonce, nonce); conn.setRequestProperty(X-Signature, signature); int code conn.getResponseCode(); BufferedReader br new BufferedReader(new InputStreamReader( code 200 code 300 ? conn.getInputStream() : conn.getErrorStream(), StandardCharsets.UTF_8 )); StringBuilder sb new StringBuilder(); String line; while ((line br.readLine()) ! null) { sb.append(line); } br.close(); conn.disconnect(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); return 代理接口异常 e.getMessage(); } } }3.页面跳转控制器Controller public class TestController { GetMapping(/huoqu) public String toHuoquList() { return huoqu-list; } }4.全局跨域配置import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/api/**) .allowedOrigins(*) .allowedMethods(GET) .maxAge(3600); } }

相关新闻

Kimi K3:智能的新前沿

Kimi K3:智能的新前沿

Kimi K3:智能的新前沿 原创 Kimi K3 月之暗面 Kimi 2026年7月17日 01:02 天津 犯其至难而图其至远者,发之以勇,守之以专,达之以强。 今天,我们正式推出 Kimi K3,我们迄今能力最强的模型。 Kimi K3 是一个…

2026/7/18 22:01:29 阅读更多 →
小蜜陪护机器人 - ESP32-CAM 摄像头配置指南

小蜜陪护机器人 - ESP32-CAM 摄像头配置指南

小蜜陪护机器人 ESP32-CAM 摄像头配置指南 一、小蜜陪护机器人使用 ESP32-CAM 摄像头 小蜜陪护机器人集成了计算机视觉能力,能够实时分析家中画面,提供安防监控、老人看护、宠物观察等功能。为了实现这一能力,小蜜主要采用 ESP32-CAM 作为默…

2026/7/18 22:01:29 阅读更多 →
ClickHouse跳数索引的设计与应用:Bloom Filter与MinMax在查询加速中的效果

ClickHouse跳数索引的设计与应用:Bloom Filter与MinMax在查询加速中的效果

ClickHouse跳数索引的设计与应用:Bloom Filter与MinMax在查询加速中的效果 一、全表扫描40亿行,ClickHouse也扛不住 在一个数据分析场景中,表user_events按小时分区存储了40亿条用户行为事件,查询"找出过去一周所有通过utm_s…

2026/7/18 22:00:29 阅读更多 →

最新新闻

oec-hardware性能优化技巧:提升硬件兼容性测试效率的7个方法

oec-hardware性能优化技巧:提升硬件兼容性测试效率的7个方法

oec-hardware性能优化技巧:提升硬件兼容性测试效率的7个方法 【免费下载链接】oec-cloud A tool to help checking hardware compatibility for cloud component, such as stratoVirt/iSula and so on. 项目地址: https://gitcode.com/openeuler/oec-cloud 前…

2026/7/18 22:49:53 阅读更多 →
USB工业级双模语音处理模块的ENC/AEC/BF联合优化设计

USB工业级双模语音处理模块的ENC/AEC/BF联合优化设计

一、应用背景与设计挑战在工业通信、智能楼宇、车载免提等场景中,语音采集环境普遍存在强噪声、高混响和强回声三重干扰。传统单麦模拟前端难以在复杂声场中稳定还原人声,尤其在麦克风与扬声器距离较近的全双工通话场景中,回音消除&#xff0…

2026/7/18 22:49:53 阅读更多 →
专业语音模组的双波束波形成与多模接口设计

专业语音模组的双波束波形成与多模接口设计

一、背景与痛点在免提全双工通话、专业会议扩声以及双分区翻译等设备中,语音链路长期面临三类相互耦合的难题:其一,环境噪声(风扇、空调、敲击、风噪及汽车鸣笛等)会显著抬升信噪比阈值,使远端听感模糊&…

2026/7/18 22:49:53 阅读更多 →
USB免驱工业级双通道语音处理模块的系统集成方案

USB免驱工业级双通道语音处理模块的系统集成方案

产品定位与差异化A-59U是独立于A59P的产品型号,两者参数差异显著。A-59U定位为USB免驱工业级双通道多模语音处理模块,强调跨平台兼容性和工业级可靠性,而A59P(专业版)在AI降噪能力、接口丰富度、参数可调性上更为高端。…

2026/7/18 22:49:53 阅读更多 →
边缘AI处理器的架构创新

边缘AI处理器的架构创新

电子发烧友网报道(文/李弯弯)进入2026年,人工智能产业正站在一个关键的结构性拐点上。随着端侧大模型轻量化技术的成熟以及强推理模型的出现,AI的重心正加速从云端的集中式训练向边缘侧的高效推理迁移。 然而,这一迁移…

2026/7/18 22:49:53 阅读更多 →
大模型范式里程碑!商汤科技旗舰级SenseNova U1 Pro正式发布:从“内容生成”走向“系统级交付”

大模型范式里程碑!商汤科技旗舰级SenseNova U1 Pro正式发布:从“内容生成”走向“系统级交付”

7月18日,在2026世界人工智能大会(WAIC)上,商汤科技正式发布了大模型家族的重量级旗舰新品——SenseNova U1 Pro(以下简称U1 Pro)。作为“日日新 SenseNova U”系列的旗舰版本,U1 Pro 定位为面向…

2026/7/18 22:48:53 阅读更多 →

日新闻

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:38 阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:38 阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:38 阅读更多 →

周新闻

月新闻