api的封装

2023-11-07

这是以 cnode中文社区的api 为例

值得一提的是有些请求可能要先进行url的编码

‘’
这是简易版的

'use strict'
// api 路径// get /topics 主题首页//get /topic/:id 主题详情
// post /accesstoken 验证 accessToken 的正确性// post /topic_collect/collect 收藏主题
// post /topic_collect/de_collect 取消主题// post /reply/:reply_id/ups 为评论点赞
const HOST = 'https://cnodejs.org/api/v1';

const topics = HOST + '/topics';

const topic = HOST + '/topic';

const accesstoken = HOST + '/accesstoken';

const collect = HOST + '/topic_collect/collect';

const de_collect = HOST + '/topic_collect/de_collect';

function reply (id) {
  return HOST + '/reply/'+ id +'/ups'
}

// get请求方法
function fetchGet(url, callback) {
  // return callback(null, top250)
  wx.request({
    url: url,
    header : { 'Content-Type': 'application/json' },
    success (res) {
      callback(null, res.data)
    },
    fail (e) {
      console.error(e)
      callback(e)
    }
  })
}

// post请求方法
function fetchPost(url, data, callback) {
  wx.request({
    method: 'POST',
    url: url,
    data: data,
    success (res) {
      callback(null, res.data)
    },
    fail (e) {
      console.error(e)
      callback(e)
    }
  })
}

module.exports = {
  // API
  topics,
  topic,
  accesstoken,
  collect,
  de_collect,
  reply,


  // METHOD
  fetchGet,
  fetchPost


}

高级详细版的(重要的还是学会如何去封装)

module.exports = class CNodeApi {
    constructor(){
        this.api = "https://cnodejs.org/api/v1";
    }
    /**
     * 获取主题列表
     * @param {Json} param
     * @param {Number } param.page 页数
     * @param {String } param.tab 主题分类。目前有 ask share job good
     * @param {Number } param.limit 每一页的主题数量
     * @param {boolean } param.mdrender  每一页的主题数量
     * @return {Promise[Array] } 承载主题列表 Promise
    */
    getTopicData(param){
        return new Promise((resolve, reject) => {
            wx.showLoading({
                title: '拼命加载中...',
            });
            wx.request({
                url: `${this.api}/topics`,
                data: param,
                method: 'GET',
                dataType: 'json',
                success: (res) => {
                    resolve(res);
                    wx.hideLoading();
                },
                fail(err){
                    reject(err);
                }
            });
        });
    }
    /**
     * 获取主题详情
     * @param {Number } id 
     * @param {String } mdrender 当为 false 时,不渲染。默认为 true,渲染出现的所有 markdown 格式文本。
     * @param {String } accesstoken String 当需要知道一个主题是否被特定用户收藏以及对应评论是否被特定用户点赞时,才需要带此参数。会影响返回值中的 is_collect 以及 replies 列表中的 is_uped 值。
     * @return {Promise[Json] } 承载主题内容 Promise
    */
    getTopicCon(id, ismdrender) {
        
        return new Promise((resolve, reject) => {
            wx.showLoading({
                title: '拼命加载中...',
            });

            wx.request({
                url: `${this.api}/topic/${id}`,
                data: {
                    mdrender: ismdrender||true,
                    accesstoken: this.checkLogin()||''
                },
                method: 'GET',
                dataType: "json",
                success(res) {
                    resolve(res);
                },
                fail(err) {
                    reject(err);
                    wx.hideLoading();
                }
            })
        });
    }
    /**
     * accesstoken 验证 accessToken 的正确性
     * @param {String} token 用户的 accessToken
     * @return {Promise[json]} 如果成功匹配上用户,返回成功信息。否则 403。
    */
    autoAccessToken(token){
        return new Promise((resolve, reject) => {
            wx.request({
                url: `${this.api}/accesstoken`,
                data: {
                    accesstoken: token
                },
                method: 'POST',
                dataType: 'json',
                success(res){
                    resolve(res);
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    }
    /**
     * 收藏主题
     * @param {String} id 主题 id
     * @return {Promise[json]} 返回值示例 {"success": true}
    */
    collectTopic(id){
        return new Promise((resolve, reject) => {
            const token = this.checkLogin();
            if (!token) return reject('No login!');
            
            wx.request({
                url: `${this.api}/topic_collect/collect `,
                data: {
                    accesstoken: token,
                    topic_id: id
                },
                method: 'POST',
                dataType: 'json',
                success(res) {
                    resolve(res);
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    }
    /**
   * 取消收藏主题
   * @param {String} id 主题 id
   * @return {Promise[json]} 返回值示例 {"success": true}
  */
    deCollectTopic(id) {
        return new Promise((resolve, reject) => {
            const token = this.checkLogin();
            if (!token) return reject('No login!');

            wx.request({
                url: `${this.api}/topic_collect/de_collect  `,
                data: {
                    accesstoken: token,
                    topic_id: id
                },
                method: 'POST',
                dataType: 'json',
                success(res) {
                    resolve(res);
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    }
    /**
     * 为评论点赞
     *  说明:接口会自动判断用户是否已点赞,如果否,则点赞;如果是,则取消点赞。点赞的动作反应在返回数据的 action 字段中,up or down。
     * 返回值示例: {"success": true, "action": "down"}
     * @param {String} id 评论id
    */
    replyUps(id){
        return new Promise((resolve, reject) => {
            const token = this.checkLogin();
            if (!token) return reject('No login!');

            wx.request({
                url: `${this.api}/reply/${id}/ups `,
                data: {
                    accesstoken: token
                },
                method: 'POST',
                dataType: 'json',
                success(res) {
                    resolve(res);
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    }
    /**
     * 获取用户详情
     * @param {String} loginname 用户名称
    */
    getUserInfo(loginname){
        return new Promise((resolve, reject) => {
            wx.request({
                url: `${this.api}/user/${loginname} `,
                method: 'GET',
                dataType: 'json',
                success(res) {
                    resolve(res.data);
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    }
    /**
     * 获取用户收藏主题
     * @param {String} loginname 用户名称
    */
    getUserCollectTopic(loginname){
        return new Promise((resolve, reject) => {
            wx.request({
                url: `${this.api}/topic_collect/${loginname} `,
                method: 'GET',
                dataType: 'json',
                success(res) {
                    resolve(res.data);
                },
                fail(err) {
                    reject(err);
                }
            });

        });
    }
    /**
     * 新建评论
     * @param {String} id 主题 id
     * @param {String} content 评论主体内容 
     * @param {String} replyId 如果这个评论是对另一个评论的回复,请务必带上此字段。这样前端就可以构建出评论线索图。
     * @return {Promise[json]} 示例:{success: true, reply_id: '5433d5e4e737cbe96dcef312'}
     */
    buildReplies(id, content, replyId ){
        return new Promise((resolve, reject) => {
            const token = this.checkLogin();
            if (!token) return reject('No login!');

            wx.request({
                url: `${this.api}/topic/${id}/replies`,
                data: {
                    content: content,
                    reply_id: replyId||'',
                    accesstoken: token
                },
                method: 'POST',
                dataType: 'json',
                success(res) {
                    resolve(res.data);
                },
                fail(err) {
                    reject(err);
                }
            });

        });
    }
    /**
     * 检查是否登录
     * @param {boolean} isShowModal 如果没登录是否打开弹窗,需要挂载在 Page 上,示例:Page({checkLogin: cnodeApi.checkLogin});
     * @param {Function} callback 确定回调
     * @return {String} token
    */
    checkLogin(isShowModal, callback){
        const token = wx.getStorageSync('token');
        
        if (token === '' ){
            if (isShowModal){
                wx.showModal({
                    title: '还没登录,是否登录?',
                    success: res => callback && callback(res)
                });
            }
            return false;
        }
        return token;
    }
    /**
     * 验证登录
     * @return {Promise[Json]} 承载用户信息 Promise
    */
    autoLogin(){
        return new Promise((resole,reject) => {
            const token = this.checkLogin();
            if (!token) return reject('No login!');

            this.autoAccessToken(token).then(res => {
                if (res.data.success) {
                    return resole(res.data);
                }
                return resole(false);
            }).catch(err => reject(err));
        });
    }
}
  • 另一个列出所有参数的版本
module.exports={
	// get /topics 主题首页
  getTopics(options, callback){
    let apiUrl="https://cnodejs.org/api/v1/topics?";

    if (typeof options==='function'){
		callback=options;
     	options={};
    };

// 设置文档参数;默认为后面的一个值;
    let params={
      page: options.page || 1,
      limit: options.limit || 10,
	  tab: options.tab || 'all',
	  mdrender: true  // true, 默认值渲染Markdown的格式;
	}
	apiUrl += set(params);
	// console.log(apiUrl);
	request(apiUrl, callback);
  },

	
	// get /topic/:id 主题详情
  getTopic(topicId, callback){
    let apiUrl='https://cnodejs.org/api/v1/topic/' + topicId + '?';	 
		// 参数
    let params={
		accesstoken: '',
		mdrender: false,
	}
	apiUrl += set(params);
    request(apiUrl, callback);
  }
  
};



// 获取数据, 将数据数据整合(有些复杂)
function request(url, callback){
	wx.request({
		url: url,
		date:{},
		header:{
			"Content-Type":"application/json"
		},
	// 获取数据;
	success(res){
		// console.log(res);
		callback(res.data);
	}

	})

}

// 进行url编码, 遍历拿到值(这里使用的函数有难度,想不到)

function set(object) {
    return Object.keys(object).map( (k) => {
			// console.log((k +'='+object[k]).join('&'));
		// return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]);	
			// console.log(object[k]);
			
        return k + '=' + object[k];
    }).join('&');
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

api的封装 的相关文章

  • RTL8762DK-最小系统板

    目录 概述 一 原理图 二 PCB 三 总结 概述 此 RTL8762DK 最小系统板 已画了有一段时间 思来想去 还是开源了 供大家参考 环境是使用AD绘制 学习RTL8762DK 可以在淘宝购买一块开发板 当然 喜欢折腾的人 自己动手画
  • 解决master主分支与其他分支冲突的问题

    我们在拉取代码的时候 有时候会本地修改一些东西 这就需要解决方法 出现 MERGING 报错后 先手动清除报错的地方 然后操作 git add git commit m ceshi git pull origin master 由于我在本地
  • 搭建Web环境、JSP初识

    理解C S和B S架构及其优缺点 B Browser S Server 网站 优点 不需要更新 服务器端更新 客户端基本不受影响 刷新一下可能就更新了 跨平台 只需要有浏览器 就可以使用 write once run anywhere 缺点
  • 机器学习技法 之 聚合模型(Aggregation Model)

    聚合模型实际上就是将许多模型聚合在一起 从而使其分类性能更佳 aggregation models mix or combine hypotheses for better performance 下面举个例子 你有 T T T 朋友 他们
  • 深入解构objc_msgSend函数的实现

    阅读本文后你将会进一步了解Runtime的实现 享元设计模式的实践 内存数据存储优化 编译内存屏障 多线程无锁读写实现 垃圾回收等相关的技术点 objc class Class对象 结构简介 熟悉OC语言的Runtime 运行时 机制以及对
  • spark应用tips

    1 正常sprkui会在scan和exchange都有数据显示 前者是条数 后者是存储 如果不显示说明这个阶段没有数据 2 stats size 是逻辑上基于读取表存储估算的可能广播的数据大小 data size 是执行期间 根据shuff
  • [linux] shell 输入/输出重定向 、 文件包含

    Shell 输入 输出重定向 大多数 UNIX 系统命令从终端接受输入并将所产生的输出发送回 到终端 一个命令通常从一个叫标准输入的地方读取输入 默认情况下 这恰好是自己的终端 同样 一个命令通常将其输出写入到标准输出 默认情况下 这也是自
  • flask 视频流直播

    flask 视频流直播 本文将介绍如何本地通过浏览器查看远端服务器的摄像头采集到的视频 服务端 实现实时视频流式传输主要采用服务器推送技术 服务器在响应请求时 HTTP使用MIME报文格式来封装数据 通常一个HTTP响应只能包含一个数据块
  • 关于 Error: Cannot find module ‘webpack/lib/RuleSet‘ 的详细解决方法(亲测有效)- 以及删除脚手架的方法

    对于出现的这个错误 之前我也尝试了网上的多种解决方案 最终经过测试后 是通过将原来的 vue cli 版本降级到 4 5 15 版本 最后再重新安装 node modules 包 才得以解决 下面是我将介绍怎么安装 4 5 15 版本的脚手
  • linux svn 用户名存储,Linux下SVN账户密码保存设置

    Linux下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 因此搜了下解决办法 总结如下 Linux下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 因此搜了下解决办法 总结如下 打开SVN配置文件 vim ho
  • SQL注入(2)——各种注入

    本专栏是笔者的网络安全学习笔记 一面分享 同时作为笔记 前文链接 WAMP DVWA sqli labs 搭建 burpsuite工具抓包及Intruder暴力破解的使用 目录扫描 请求重发 漏洞扫描等工具的使用 网站信息收集及nmap的下
  • 亲密关系沟通-【独特性】尊重与探索他人

    忽视自己是逃避 忽视对方也是逃避 故事 理发师抱怨老婆不换空调 你有没有问过她 为什么不愿意换 谁知道她怎么想的 你承认对方的独特性 就不用做任何改变 叙述测试 你讲述经历里的别人有ta的想法吗 如何把对方从一个活生生的人变成ta就是那样的
  • HTTPS为什么安全 &分析 HTTPS 连接建立全过程

    本文将分两个专题去理解HTTPS 专题一 HTTPS为什么安全 1 http为什么不安全 http协议属于明文传输协议 交互过程以及数据传输都没有进行加密 通信双方也没有进行任何认证 通信过程非常容易遭遇劫持 监听 篡改 严重情况下 会造成
  • WSL无法保存文件(权限不足)

    sudo chown R username 其中username是你的用户名
  • windows vscode 安装+配置go环境

    一下载 go语言官方下载地址 https golang org dl 找到适合你系统的版本下载 本人下载的是windows版本 也可以下载Source自己更深层次研究go语言 二安装 一路next 三 安装后目录 Go语言安装之后 C Go
  • WebApi 打个Attribute 统一处理异常

    我们处理异常的时候通常都要写形如以下的代码 try xxxxx catch Exception ex log write ex Message 前一段时间看杨中科的视频 其中吐糟了 mvc 的管道机制 当然用在web ui 的渲染上这个还不
  • Buck电路基础知识

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net weixin 42005993 article details 120144144 这
  • Windows下libmodbus库的编译和使用

    一 前言 最近要搞一个PC端Qt上位机控制机械手的移动 需要用到串口io卡 控制的话需要使用libmodbus库 就想着自己编译一下libmodbus库 过程如下 二 编译过程 2 1 libmodbus的下载和安装 下载地址 https
  • pytorch7-可视化训练过程(过程中显示)

    import torch import torch nn as nn import torchvision import torchvision utils as vutils from torch optim import SGD imp

随机推荐

  • 安全连载——CSDN区块链大本营出品

    史上杀伤力最大的溢出型漏洞到底是什么 看这一篇就够了 第1期 4月发生的BEC事件以及SMT事件已经沉淀一段时间了 具体的情况也被多方媒体所报道 相关的漏洞根源问题也有很多大神团队的分析和指正 近日 有安全团队将各种已经发生或可能发生的类似
  • Marshaller和Unmarshaller用法示例

    import java io FileNotFoundException import java io FileOutputStream import java io OutputStream import javax xml bind J
  • Qt之QDialog禁用右上角关闭按钮

    setWindowFlags windowFlags Qt WindowCloseButtonHint
  • 【深度学习】笔记12:win10下的VS2013编辑代码的时候,非常卡顿,怎么样解决?

    给新电脑连续配置了三天环境 双系统下的caffe和NVIDIA环境配置好之后 终于可以看代码了 结果在vs2013下对代码进行注释的时候 代码编辑器用起来非常卡顿 这个问题的解决方法如下所示 1 首先确定是不是硬件和系统的问题 据说win8
  • 2.4.1 C# 和 F# 中的类型推断

    2 4 1 C 和 F 中的类型推断 大多数的类型有简称 例如 int 或 Random 只有很少一部分需要类型推断 因为手写类型名称并不困难 C 2 0 支持泛型 因此 可以构造更复杂的类型 在函数语言中的类型 像 F 是相当复杂的 尤其
  • R语言legend函数参数详解

    legend x y NULL legend fill NULL col par col border black lty lwd pch angle 45 density NULL bty o bg par bg box lwd par
  • Scala学习系列(二)——环境安装配置

    Scala下载地址 https www scala lang org download 一 安装JDK 首先 因为Scala是运行在JVM平台上的 所以安装Scala之前要安装JDK 二 二进制安装方式 我们可以直接用二进制安装Scala
  • 合并BPL包图文教程

    Delphi IDE 本身就是一个插件模式的工具 插件的好处不用多说 运行包的BPL 其实就是众多单元的集合 因此可以再次重新组合 只要你将各个BPL包用到的单元再组合一次 本文以 http code google com p tangra
  • libuv源码分析(1)事件循环分析

    前言 libuv总是报出一些让人难以理解的错误 作为一个C的项目 不具有Java JavaScript php那样的人气 很难百度到一些问题的答案 甚至google也不行 为了用好libuv 也为了学习吧 我开始看libuv的源码 不知道自
  • 【正点原子STM32连载】 第三十一章 睡眠模式实验 摘自【正点原子】APM32F407最小系统板使用指南

    1 实验平台 正点原子stm32f103战舰开发板V4 2 平台购买地址 https detail tmall com item htm id 609294757420 3 全套实验源码 手册 视频下载地址 http www openedv
  • 《机器学习》周志华(西瓜书)学习笔记 第二章 模型评估与选择

    机器学习 周志华 学习笔记 总目录 世上只有一种投资是只赚不赔的 那就是学习 当你的的能力还驾驭不了你的目标时 就应该沉下心来历练 当你的才华撑不起你的野心时 就应该静下心来学习 第二章 模型评估与选择 2 1 经验误差与过拟合 错误率 E
  • 11 【标准库之JSON对象 JSON5】

    13 JSON 对象 13 1 JSON 格式 JSON 格式 JavaScript Object Notation 的缩写 是一种用于数据交换的文本格式 2001年由 Douglas Crockford 提出 目的是取代繁琐笨重的 XML
  • 递归视角下

    def listSum numbers if not numbers return 0 else f rest numbers return f listSum rest myList 1 2 3 4 None total listSum
  • 在存储过程中IN传入参数无效的解决方法

    列 SELECT count COUNT sysid FROM Student WHERE Id IN Sysids 想要得到count 但是在in的时候 传入的参数无效 得到的结果只能为0 这时候可以将其转化成一条变量语句 然后去执行这条
  • websocket即时通讯

    目录 一 websocket简介 二 背景 三 优点 1 控制开销 2 实时性更强 3 保持连接状态 4 更好的二进制支持 5 支持扩展和更好的实现压缩效果 四 原理 1 客户端 服务器建立TCP连接 三次握手 2 TCP连接成功后 客户端
  • PANet[详解]

    一 Abstract摘要 Introduction介绍 Abstract 信息在神经网络中的传播方式非常重要 本文提出了一种基于提议的实例分割框架下的路径聚合网络Path Aggregation Network PANet 旨在促进信息的流
  • SQL Server 2019 Express的安装

    SQL Server 2019 Express的安装 下载安装程序 SQL Server 2019 Express 安装SQL Server 双击运行SQL2019 SSEI Expr exe 运行下载程序 选择自定义 点击安装 稍等几分钟
  • 小程序消息推送配置 Token校验失败,请检查确认

    一 小程序消息推送配置 Token校验失败 请检查确认 添加配置失败 原因 只要是没有echostr原样返回 就会报错 注意 返回的事echostr的内容 而不是key value格式 示例如下 return Content reqData
  • 大数据数据湖技术Hudi0.12.0版本源码编译

    0 介绍 Apache Hudi Hadoop Upserts Delete and Incremental 是下一代流数据湖平台 Apache Hudi将核心仓库和数据库功能直接引入数据湖 Hudi提供了表 事务 高效的upserts d
  • api的封装

    这是以 cnode中文社区的api 为例 值得一提的是有些请求可能要先进行url的编码 这是简易版的 use strict api 路径 get topics 主题首页 get topic id 主题详情 post accesstoken