likes
comments
collection
share

天天基金网 NodeJS 版 API - 思路(一)

作者站长头像
站长
· 阅读数 20

我报名参加金石计划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 抓包就可以得到。这里不阐述过程

请求接口

请求接口需要按照「天天基金网」所需的接口,封装出几个常用的方法。

普通的接口

getpost 是类似的,主要是提供封装思路。预期传入 urlparams 即可返回数据

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 ~)

主要学习一下处理问题的思路。

  1. 接口请求的封装。
  2. node 下,尝试脱离浏览器的思路。
  3. 让代码自动起来。

至此,简单的项目雏形就有了,后面还会分享: