上一篇文章说一下,后台接口的创建,这篇说一下如果调用接口。

创建一个目录helpers

  • 此目录下有三个文件分别是 ApiClient.ts、clientMiddleware.ts、Core.ts,前面两个文件。
  • 是因为在React项目中调用后台接口用,用这个挺方便很好用的,将其引入到Angular4里方便调接口调用。
  • 在Vue项目其实也一样可以用,个人觉得这个要比用vue-source用起来方便,具体在Vue中怎么使用,在我的github https://github.com/xiaotuni/vue2-demo有怎么用的。

ApiClient

这里其实也挺简单的,这里主要是一些接口定义。然后就是

import superagent from 'superagent';
import { Utility } from '../Common/Utility'; const methods = ['get', 'post', 'put', 'patch', 'del']; /**
* 格式化URL
*
* @param {any} path
* @returns
*/
function formatUrl(path) {
const __path = path[0] !== '/' ? '/' + path : path;
const _ApiUrl = 'https://127.0.0.1:10001/webapi' + __path;
return _ApiUrl;
} /**
* 访问接口类
*
* @export
* @class ApiClient
*/
export default class ApiClient {
/*
* 这里定义接口的地方,将所有接口的定义放到一起
* 方便统计管理,查询也很方便
*/
API = {
UserInfo: {
Info: '/userinfo/user', // 获取用户接口
Add: '/userinfo/user', // 添加用户
Delete: '/userinfo/user', // 删除用户
Put: '/userinfo/user', // 修改用户
}
} /**
* Creates an instance of ApiClient.
* @param {any} req
* @memberof ApiClient
*/
constructor(req) {
/**
* 循环生成五个方法
*/
methods.forEach((method) => {
this[method] = (path, condition) => {
const { params, data } = condition || { params: null, data: null };
return new Promise((resolve, reject) => {
const request = superagent[method](formatUrl(path)); if (params) {
request.query(params);
} if (req && req.get('cookie')) {
request.set('cookie', req.get('cookie'));
} if (data) {
request.send(data);
}
request.header.xiaotuni = 'liaohaibing_' + new Date().getTime(); const { HttpStatus } = Utility.$ConstItem.Events;
/**
* 统一的错误处理及提示,这样可以省去写拦截器了,这就相当于拦截器。
* @param {any} err 错误信息
* @param {any} body 返回的数据
* @param {any} __req request
*/
function __ProcessError(err, body, __req) {
try {
Utility.$LoadingHide();
const { code, msg } = body || { code: 400, msg: '处理错误' };
if (err.status) {
if (HttpStatus[err.status]) {
if (err.status === 400 && HttpStatus[__req.status]) {
Utility.$Emit(HttpStatus[__req.status], { code: code || __req.status, msg: msg || err.message, body });
} else {
Utility.$Emit(HttpStatus[err.status], { code: code || err.status, msg: msg || err.message, body });
}
} else {
Utility.$Emit(HttpStatus[400], { code: err.status, msg: err.message });
}
} else if (!!err.crossDomain) {
Utility.$ActionSheet('与服务器连接中断...');
} else if (err.message && err.message !== '') {
Utility.$ActionSheet(err.message);
}
} catch (ex) {
console.log(ex);
}
} function __SendRequest(_request) {
_request.end((err, Response) => {
const { body } = Response || { body: {} };
if (err) {
__ProcessError(err, body, Response);
reject(body);
} else {
if (!body) {
Utility.$Emit(HttpStatus[Response.status], { status: Response.status, msg: '处理成功', Response });
}
resolve(body);
}
});
} try {
__SendRequest(request);
} catch (ex) {
console.log(ex);
}
});
}
});
}
empty() {
}
}

ClientMiddleware.ts文件

在React Redux当中有必须将返回的数据通过types把数据存放到store里;

在Vue里有一个Vuex的,也是通过这个文件将数据存放到store里去的;

而在Angular里返回的数据,我是喜欢把他放到自己的Service里的。个人认为,也可能我表达的不是很清楚,理伦学的不够扎实呀。

这个里的东西很少,代码其实还可以现简练点的。

export default function ClientMiddleware(client) {

  /**
* 批处理操作
*
* @param {any} args
* @returns
*/
const __BatchCallAPI = (args) => {
const { commit, actions } = args;
const { loading, fail, complete, list } = actions;
const __APIList = [];
list.forEach((item) => {
const { promise } = item;
__APIList.push(promise(client));
});
return Promise.all(__APIList).then((results) => results, (err) => err).catch((error) => error);
}; /**
* 方法调用
*
* @param {any} args
* @returns
*/
const __CallMethod = (args) => {
const { dispatch, commit, state, action, actions } = args;
// 判断是否是批量调用接口
if (actions) {
return __BatchCallAPI(args);
}
if (typeof action === 'function') {
return action(dispatch, state);
}
const { promise, type, ...rest } = action; return promise(client).then((result) => result, (error) => error).catch((error) => error);
};
return __CallMethod;
}

Core.ts 文件

对外提供用,外引的要用这个目录里类,直接引用此文件就可以了,不用去再别ApiClient.ts及ClientMiddleware.ts文件。在这里已经封装好了。

import ApiClient from './ApiClient';
import ClientMiddleware from './ClientMiddleware';
export const Client = ClientMiddleware(new ApiClient(null));

下篇文件就是怎么调用接口了,点击一个 btn –>调用api->后台返回数据。

Angular4+NodeJs+MySQL 入门-04 接口调用类的更多相关文章

  1. Angular4+NodeJs+MySQL 入门-05 接口调用

    接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...

  2. Angular4+NodeJs+MySQL 入门-06 接口配置

    在上篇中说了怎么调用接口,这篇就来说说,接口配置吧. 后端是用NodeJS来写的,由于写后台(以前用的是C#语言)的时候,大部操作都在是对数据库表的增.删.改.查操作, 比如:根据查询出来的数据,然后 ...

  3. Angular4+NodeJs+MySQL 入门-03 后台接口定义

    这篇里是如何定义接口,我们一般访问接口如:post请求调用http://127.0.0.1:11000/webapi/userinfo/user 这个接口,成功返回用户信息,如果失败要返回失败原因等. ...

  4. Angular4+NodeJs+MySQL 入门-02 MySql操作类

    NodeJs操作MySQL类 此类封装了几个常用的方法:插入,更新,删除,查询,开启事务,事务提交,事务回滚等操作.有一这个类,操作MYSQL就方便多了. 批处理,存储过程等方法还没有添加,因为觉得目 ...

  5. Angular4+NodeJs+MySQL 入门-01

    有一定的后台开发经验ES6语法.后台没有用框架来,纯自己写.会sql语句 安装NodeJS的安装 从网上下载 https://nodejs.org/en/ 选择自己,我用的是最新版本 Angular ...

  6. nodejs+mysql入门实例

    此前我已准备好mysql,使用的是PHP的组合包Appserv 手动添加数据库依赖: 在package.json的dependencies中新增, “mysql” : “latest”, { &quo ...

  7. nodejs+mysql入门实例(删)

    //连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'bdm253137448. ...

  8. nodejs+mysql入门实例(改)

    //连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'bdm253137448. ...

  9. nodejs+mysql入门实例(表的查询)

    //连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: '******', //数据 ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的

    建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的 在建议50中,我们将C#中的类型分为:普通类型和继承了IDisposable接口的非普通类型.非普通类型除了包含那些托管资源的类型外, ...

  2. Git教程--廖雪峰

    Git简介 1.Git是目前世界上最先进的分布式版本控制系统(没有之一) 2.集中式和分布式版本控制系统有什么区别呢?      区别在于历史版本维护的位置:Git本地仓库包含代码库还有历史库,在本地 ...

  3. 生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题

    原创 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日 ...

  4. MongoDB整理笔记のMapReduce

    MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...

  5. MSSQL 静态值查询

    有些时候可能会需要查询一些静态值 ), (),()) AS tabName ( c1 ) 演变1.多列 ,), (,),(,)) AS tabName ( c1,c2 ) 演变2.聚合 ), (),( ...

  6. 数独·唯一性技巧(Uniqueness)-1

    唯一性技巧基于这样一个事实——各类出版物上发布的数独题目都只有唯一解.事实上,绝大多数数独玩家有这样的共识:即合格的数独题目解应该是唯一的.因此,为了保证题目合格.有效,出题者在制作题目时,会将一些虽 ...

  7. 《Think in Java》

    chapter 1 对象导论 面向对象程序设计(Object-oriented Programming ,OOP) chapter 2 一切都是对象 字段和方法 若类的某个成员变量是基本数据类型,即是 ...

  8. day1学python Hello Python

    Hello Python 本人使用的是Pycharm编译器 ----------------------------------------------- 1.输出 2.赋值 3.‘’‘/“”“ 多行 ...

  9. C# 小球100米自由落下

    //一球从N 米高自由落下,每次落地后反跳回原高度的一般:再录下,求它在第十次落地时,共经过多少米?第10次反弹多高 static string ballDsitance(float height1, ...

  10. 51nod1464(trie + dfs)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1464 题意: 中文题诶~ 思路: 将所有半回文串构建成一棵字 ...