天天基金网 NodeJS 版 API - 思路(一)
我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情
内容这可能对新手更友好,过程很枯燥,可以直接看总结
天天基金网 NodeJS 版 API,已经完成 30 个接口,满足一个小型基金网站的常用 api,如果在使用中遇到了不能满足的情况,欢迎 pr ~,同时也希望小伙伴们点个 star ~ 支持本地服务启动
灵感来源
作为一个合格的韭菜,自然是想无时无刻关注自己持仓的 100 块钱,也经常浏览基金相关的网站,但是能用的基金网站实在是太少了,并且「天天基金网」真的是太丑了,无数次想写一个基金的网站,相信很多小伙伴也有类似的想法,也找不到合适的数据来源,找来找去,不如自己来写一个。之前模仿网易云的项目用到了 NeteaseCloudMusicApi ,也做一个类似的基金的 API 项目。于是诞生了 TiantianFundApi。(🙏🏻 顺手点进去,也顺手点个 star ~)
基本思路
用 koa
搭建一个服务,使用 axios
请求「天天基金网」的接口。总共需要三步:
搭建服务
const koa = require('koa');
const Router = require('@koa/router');
const app = new koa();
const router = new Router();
router.get(routerPath, async (ctx, next) => {
ctx.status = 200;
ctx.body = await getData(xxx, query);
next();
});
app.use(router.routes()).use(router.allowedMethods());
const server = app.listen(3000, () => {
resolve(server);
});
获得接口
手机连接电脑,使用 charlse
抓包就可以得到。这里不阐述过程
请求接口
请求接口需要按照「天天基金网」所需的接口,封装出几个常用的方法。
普通的接口
get
和 post
是类似的,主要是提供封装思路。预期传入 url
和 params
即可返回数据
const request = async (url, params) => {
const res = await axios(url, {
headers,
params: {
...baseData,
...params,
},
});
return res.data;
};
jsonp 请求
有一部分接口使用的官方网站接口,这些使用 jsonp 来做的,相信大家也知道原因,为了解决跨域问题。 预期传入 url 和 params ,还有 callback 字符串。
思考一下,如何在node中请求 jsonp ?除了执行 js 还有没有别的办法 ?
在 node
中,有一个简单有效的办法,通过字符串处理 js
转成 json
,这样很简单,也不用担心投毒。
const jsonp = async (url, callback, params) => {
const res = await axios(url, { params });
const js = res.data.replace(/[\n]/g, '').replace(/\r/g, '');
return JSON.parse(js.slice(callback.length + 1, js.length - 1));
};
路由处理
可预见的,未来会有很多接口,每次都要去手写一段路由是很麻烦的。可不可以写好接口,自动注册路由呢?如何做到“自动”起来?总共需要三步:
获取接口名作为路由
将接口分为不同的文件,放到同一个目录下,遍历这个目录,以文件名作为路由名
const glob = require('glob');
const getModules = () => {
const files = glob.sync('./src/module/*.js');
return files.map((path) => {
const fileName = path.replace('./src/module/', '').replace('.js', '');
return {
fileName,
path: path.replace('/src', ''),
};
});
};
获取接口函数
当我们有了文件路径,就可以引用进来
getModules().forEach(({ fileName, path }) => {
// 路由
const routerPath = `/${fileName}`;
// 接口函数
const api = require(path);
});
注册路由
getModules().forEach(({ fileName, path }) => {
// 路由
const routerPath = `/${fileName}`;
// 接口函数
const api = require(path);
router.get(routerPath, async (ctx, next) => {
ctx.status = 200;
ctx.body = await api(ctx.request.query);
next();
});
});
总结
TiantianFundApi(🙏🏻 求大家点赞、收藏、star ~)
主要学习一下处理问题的思路。
- 接口请求的封装。
- node 下,尝试脱离浏览器的思路。
- 让代码自动起来。
至此,简单的项目雏形就有了,后面还会分享:
- 基础思路 👉 《天天基金网 NodeJS 版 API - 思路(一)》
- 文档 与 github page 搭建和自动部署 👉 《天天基金网 NodeJS 版 API - 文档与部署(二)》
- 自动化测试与测试报告
- github action 基础 和 mr 检查
- Dockerfile 知识与Docker镜像发布和自动编译发布
- npm 包构建和自动发布
- 代码规范 和 githook
- ...
转载自:https://juejin.cn/post/7140655088561274917