SCI论文(www.lunwensci.com):
摘 要 :本文结合气象大数据云平台“天擎”,从基层气象业务人员的技术角度出发,给出使用 JavaScript 编程语言调用天擎系统接口的应用技巧。使用前端语言对天擎接口进行调用可以为前端工程师全栈应用天擎系统奠定基础,让基层业务人员 掌握一种编程语言就可以实现前后端全栈的技术,降低基层人员应用开发天擎系统的门槛。
关键词 :气象大数据云平台 ;JavaScriptAPI ;Node.js
Application Research of "Tianqing" Interface Based on JavaScript
ZHENG Shutian,YANG Xinyu, ZHU Liyang, QIAN Yuan
(Honghe Prefecture Meteorological Bureau, Honghe Yunnan 661400)
【Abstract】:This article combines the meteorological big data cloud platform "Tianqing" from the technical perspective of grassroots meteorological personnel, give the application skills of using JavaScript programming language to call Tianqing system interface. Using the front-end language to call the Tianqing interface can lay the foundation for the full-stack application of the Tianqing system for front-end engineers, let the grassroots business personnel master a programming language to realize the front-end and back-end full-stack technology, lower the threshold for grassroots personnel to apply and develop Tianqing system.
【Key words】:meteorological big data cloud platform;JavaScript API;Node.js
0 引言
在气象现代化高速发展的今天,信息化、智能化已经 与气象业务密不可分。全国气象综合信息共享系统 CIMISS 全面升级为气象大数据云平台“天擎”,在原本系统的功 能上对数据质量、数据时效性、资料计算提取速度和资料 种类等方面都有显著提升 [1-4]。天擎为各级应用系统提供 唯一权威的数据接入服务, 为基层人员提供开发气象应用 系统的基础和可能性, 提供全国统一标识及丰富的数据访 问服务和应用程序设计接口 (API)。天擎的服务接口针对 不同气象应用系统,提供多种服务方式,包括客户端调 用、REST 服务和脚本服务。REST 服务支持所有平台和 语言的调用, JavaScript 作为前端语言主要应用在浏览器 端网页编写,不过随着前端语言的发展, Node.js 的出现 让JavaScript 编写服务器成为可能, 所以用前端语言调 用天擎接口数据,可以实现一种编程语言对天擎平台的 全栈应用,降低基层气象人员的学习成本和门槛。
1 天擎 REST 方式调用
天擎接口提供的服务方式中有一种 REST 服务,调 用方法是通过生成符合规则的序列化字符串(URL), 提交请求后天擎对 URL 进行解析并返回系列化的字符 串数据。天擎接口在 REST 方式调用中增加了 AK/SK 的认证方式,实现方式是在 URL 参数中增加 UUID 随 机参数(Nonce)、MD5 加密参数(Sign) 和时间戳 参数(Timestamp)。在发送到天擎的请求中,用户密 码不作为 URL 参数进行网络传输,而是把包含用户名、 密码、随机数、时间戳以及其他的接口参数按照 Key 排序后再进行 MD5 加密运算(32 位),并将加密字符 串的所有字母转换为大写作为 Sign 参数,由于 MD5 加密的不可逆,传输安全性得到保障。
2 Node.js 调用天擎接口
2.1 Node.js 生成天擎接口请求 URL
在生成 URL 之前需要先引入 Node.js 自带的核心模块 Crypto 模块。利用该模块来构造一个 MD5 加密 函数,用来对后面的 stringSignTemp 字符串加密后 赋值给 Sign 参数,再构造一个生成随机数 UUID 的函 数,用来生成随机数赋值给 nonce 参数。
创建一个数组 Params 来存放所有请求参数,之后 复用代码调用其他资料时,只需要改写 Params 数组里 面的参数就可以生成新的 URL,大大提高了代码的复 用率。在将参数写入 Params 数组时需要注意将用户密 码 pwd 参数写在数组的首位,因为在最终 URL 中不传 输用户密码,所以创建一个变量 pwdStr 来存放用户密码方便之后删除。关键代码如下 :
// 创建一个数组来放所有请求参数
var params = new Array();
params[0] = "pwd=pwd";
params[1] = "userId=userID";
params[2] = "serviceNodeId=NMIC_MUSIC_ CMADAAS";
params[3] = "dataCode=SURF_CHN_PRE_MIN";
params[4] = "interfaceId=getSurfEleByTimeAn dStaID";
params[5] = "dataFormat=json";
params[6] = "staIds=56985";
params[7] = "elements=Station_Name,PRE"; params[8] = "times=20220928065000";
// 利用函数生成查询时刻的时间戳
params[9] = "timestamp=" + Date.now();
// 利用函数生成本次请求对应的随机数
params[10] = "nonce=" + uuid();
var pwdStr = "&" + params[0];
// 将所有参数按照 Key 排序
params.sort(function(a, b) {
return (a.charCodeAt()) - (b.charCodeAt()); });
// 将排序后的字符串 MD5 加密后生成 URL var stringSignTemp = "";
for (var i = 0; i < params.length; i++) {
stringSignTemp=stringSignTemp+"&"+params[i]; }
stringSignTemp = stringSignTemp.slice(1);
var URL = "http://10.208.xxx.xxx/music-ws/api?" + stringSignTemp + "&sign=" + MD5(stringSignTemp);
// 将用户密码从最终的 URL 中删除,不参与网络传输 URL = URL.replace(pwdStr, "");
2.2 Node.js 向天擎发送请求
JavaScript 在向天擎接口发送请求时采用的是 HTTP 请求方式的 GET 方法。本文提供的实现思路是利用 Node. js 的 NPM 包管理工具来对项目引入 Axios 模块,该模块 是一个基于 Promise 的 HTTP 库, 在 Node.js 中该模块会 调用原生的 HTTP 模块来创建 HTTP 请求,并且可以自 动转换JSON 格式的数据, 这样在实现向天擎发送 GET 请求和处理返回数据时就比较高效。示例代码如下 :
// 引入 axios 模块, 这里的引入路径根据自己电脑 的相对路径改写
const axios = require('./node_modules/axios/ index.js');
// 将 2.1 中计算出来的 URL 作为实参传入下列函 数中就可以发送请求并返回结果
function Get(URL){
axios.get(URL)
.then(res => {
console.log(res.data);
})
.catch(err => {
console.log(err);
});
}
2.3 利用 Node.js 的文件系统对返回的数据进行本地存储
天擎返回数据后,可以直接在 Node.js 中进行计算分 析,但是为了方便其他用户对数据进行读取计算或者跨 平台调用,需要将数据放到本地储存起来。实现方法用 到 Node.js 的另外一个核心模块 FS 模块,又称文件系统。 在 2.2 收到天擎返回结果的第一个箭头函数里面做修改就 能实现对数据的存储, 根据需求的格式将数据输出在本地 存储中。需要注意,用文件系统存储数据时需要将返回结 果转换成JSON 格式的字符串,以JSON 格式存储可以方 便跨平台调用和提高读取计算效率。示例代码如下 :
// 引入文件模块
var fs = require("fs");
function Get(URL) {
axios.get(URL)
.then(res => {
// 打开(创建)文件
var fd = fs.openSync("./test.txt", "w+"); //
将天擎返回的结果转换为 JSON 字符串
var data = JSON.stringify(res.data);
// 向文件中写入内容
fs.writeSync(fd,data);
// 关闭文件
fs.closeSync(fd);
})
.catch(err => {
console.log(err);
});
}
3 Node.js 搭建 B/S 架构的服务器
3.1 利用 Express 模块创建服务器
创建服务器时可以选择基于内置 HTTP 模块进一步封装出来 Express 模块来提高开发效率。上文中已经将天擎接口返回的数据存储在本地服务器中,服务器只需读取本地的气象数据,根据前端要求计算加工再将结果返回前端,由前端负责渲染显示就可以完成 Node.js 一种语言对天擎接口的全栈应用。在搭建服务器时为了避免跨域问题,建议设置响应头,允许跨域。
3.2 根据本机时间自动计算资料时间段的方法
在单次请求中,可以手动赋值 URL 中的时间参数times,来让天擎返回指定时间的气象数据,但服务器逻辑更为复杂。比如,实际业务中,经常需要每分钟获取一次分钟数据,而当前分钟的数据不一定在这一分钟就入库,往往存在一个时间差,可能有几分钟的延迟入库情况。利用计算机底层对时间的计算机制即时间戳可以轻松解决这个问题。本文以每分钟获取一次两分钟前的 24 小时分钟数据为例,构建两个函数来解决这个问题,第一个函数实现将任意时刻的时间对象转换成天擎可以读取的时间格式 ;第二个函数实现计算需要获取数据的开始结束时刻的时间对象。第一个函数比较简单,第二个函数中传递三个实参之后方便计算用到, 第一个是取整量 Movalue,第二个是延迟量 Lead,第三个是数据时长 Length。计算核心思路是利用 Date 的 Now 方法来获取代码运行时本地计算机时间的时间戳。获取之后根据需求对时间戳取整,再减去延迟量。数据开始时间戳用结束时间戳减去数据时长就能得到。最后将时间戳转换成时间对象。搭配 JavaScript 的定时器,设置成每分钟执行一次代码,就能实现每分钟获取一次两分钟前的 24 小时分钟数据。计算资料时间段流程图如图 1 所示。
4 总结
本文从基层气象业务人员的技术角度,给出使用JavaScript 编程语言调用天擎系统接口的应用技巧,试图弥补前端语言应用天擎接口的空白。得出以下几点总结 :
(1)天擎接口提供 REST 方式调用并增加认证方式,在 URL 参数中增加 UUID 随机数参数、MD5 加密参数和时间戳参数。加密参数中需要将其他的接口参数按照 Key 排序后再进行 MD5 加密运算,利用这种方式将用户密码进行加密,用户密码不参与最后的 URL传输,防止用户信息在传输过程中被窃取。(2)利用Node.js 的 AJAX 技术、文件系统实现接口调用和数据本地存储,并结合 Express 模块创建服务器,就可以实现单一编程语言的天擎接口服务器部署。获取需要的气象资料后服务器再根据前端需求计算分析,将加工后的资料集传输给前端渲染和展示。为前端工程师应用天擎系统提供基础思路方法,旨在降低前端语言开发者应用和开发天擎系统的学习门槛,让使用前端语言的业务人员也能方便高效地使用天擎接口。(3)提出采用函数编程自动化计算时间段参数的方法。首先获取本机时间,利用时间戳取模计算来取整所需时间,再根据提前量计算资料结束时间戳,结束时间戳减去时长获取资料开始时间戳。配合时间戳转换时间对象的函数将时间格式写成天擎时间格式,根据需求间隔设置定时器重复运行函数就实现资料随时间的自动更新下载。
参考文献
[1] 许皓皓,姚日升,沃伟峰.标准化气象数据服务接口设计与实现[J].气象科技,2018,46(4):685-691.
[2] 刘媛媛,何文春,王妍,等.气象大数据云平台归档系统设计及实现[J].气象科技,2021,49(5):697-706.
[3] 陈京华,邓莉,王舒,等.国家气象业务内网WebGIS数据服务系统设计与应用[J].气象科技,2020,48(4):496-502.
[4] 董良淼,李宇中,覃月凤,等.“天擎”预报服务客户端开发及接口应用技巧[J].气象科技,2022,50(2):297-302.
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!
文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/73789.html