最近学习利用koa搭建API接口,小有所得,如今记录下来,供之后开发时参考,相信对其余人也有用。css
就目前我所知道的而言,API有2种,一种是jsonp这种API,前端经过ajax来进行跨域请求得到数据;另外一种是restful API,前端经过fetch或者axios进行cors请求来得到数据。html
本篇博文记录我用koa打造的jsonp API。前端
能够先查看个人上一篇文章:利用koa打造jsonp API。node
参考资料:《Koa2进阶学习笔记》,KOA docsios
其实搭建restful API很简单,引入cors中间件便可,不须要设置请求头为Access-Control-Allow-Origin,这个中间件会自动帮咱们设置。咱们先引入中间件,而后重开一个路由存放restful API便可,代码以下:git
'use strict' const Koa = require('koa'); const logger = require('koa-logger'); const Router = require('koa-router'); const cors = require('@koa/cors'); const app = new Koa(); app.use(logger()); app.use(cors()); // 子路由1:主页 let routerHome = new Router(); routerHome.get('/', async (ctx) => { ctx.body = '欢迎欢迎!'; }) // 子路由2:jsonp api let routerJsonp = new Router(); routerJsonp.get('/data1', async (ctx) => { let cb = ctx.request.query.callback; ctx.type = 'text'; ctx.body = cb + '(' + '"数据"' + ')'; }) // 子路由3:restful api let routerRest = new Router(); routerRest.get('/data1', async (ctx) => { ctx.body = 'rest数据'; }) // 装载全部路由 let router = new Router(); router.use('/', routerHome.routes(), routerHome.allowedMethods()); router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods()); router.use('/restful', routerRest.routes(), routerRest.allowedMethods()); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('koa starts at port 3000!'); })
而后利用下面的请求代码,就会在控制台输出“rest数据”。github
$.ajax({ url : 'http://localhost:3000/restful/data1', type : 'get', success : function(res){ console.log(res); }, error: function() { alert("网络出现错误,请刷新!"); } });
不得不说,咱们的api是很是简陋的,咱们考虑对它作以下改进:ajax
首先支持post请求:json
'use strict' const Koa = require('koa'); const logger = require('koa-logger'); const Router = require('koa-router'); const cors = require('@koa/cors'); const app = new Koa(); app.use(logger()); app.use(cors()); // 子路由1:主页 let routerHome = new Router(); routerHome.get('/', async (ctx) => { ctx.body = '欢迎欢迎!'; }) // 子路由2:jsonp api let routerJsonp = new Router(); routerJsonp.get('/data1', async (ctx) => { let cb = ctx.request.query.callback; ctx.type = 'text'; ctx.body = cb + '(' + '"数据"' + ')'; }).post('/data1', async (ctx) => { let cb = ctx.request.query.callback; ctx.type = 'text'; ctx.body = cb + '(' + '"数据"' + ')'; }) // 子路由3:restful api let routerRest = new Router(); routerRest.get('/data1', async (ctx) => { ctx.body = 'rest数据'; }).post('/data1', async (ctx) => { ctx.body = 'rest数据'; }) // 装载全部路由 let router = new Router(); router.use('/', routerHome.routes(), routerHome.allowedMethods()); router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods()); router.use('/restful', routerRest.routes(), routerRest.allowedMethods()); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('koa starts at port 3000!'); })
而后咱们新建jsonp.data1.yaml文件做为jsonp API的原始数据,新建restful.data1.yaml做为restful API的原始数据。axios
//jsonp.data1.yaml api: "jsonp" info: version: "0.0.1" title: test for jsonp //restful.data1.yaml api: "restful" info: version: "0.0.1" title: test for restful
而后咱们添加fs库(node自带,不须要install)和yamljs库进行导入和解析yaml文件,而且用JSON.stringify方法把json对象转化为字符串:
'use strict' const Koa = require('koa'); const logger = require('koa-logger'); const Router = require('koa-router'); const cors = require('@koa/cors'); const fs = require('fs'); const YAML = require('yamljs'); const app = new Koa(); app.use(logger()); app.use(cors()); // 子路由1:主页 let routerHome = new Router(); routerHome.get('/', async (ctx) => { ctx.body = '欢迎欢迎!'; }) // 子路由2:jsonp api let routerJsonp = new Router(); routerJsonp.get('/data1', async (ctx) => { let cb = ctx.request.query.callback; ctx.type = 'text'; ctx.body = cb + '(' + JSON.stringify(YAML.parse(fs.readFileSync('./jsonp.data1.yaml').toString())) + ')'; }).post('/data1', async (ctx) => { let cb = ctx.request.query.callback; ctx.type = 'text'; ctx.body = cb + '(' + JSON.stringify(YAML.parse(fs.readFileSync('./jsonp.data1.yaml').toString())) + ')'; }) // 子路由3:restful api let routerRest = new Router(); routerRest.get('/data1', async (ctx) => { ctx.body = YAML.parse(fs.readFileSync('./restful.data1.yaml').toString()); }).post('/data1', async (ctx) => { ctx.body = YAML.parse(fs.readFileSync('./restful.data1.yaml').toString()); }) // 装载全部路由 let router = new Router(); router.use('/', routerHome.routes(), routerHome.allowedMethods()); router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods()); router.use('/restful', routerRest.routes(), routerRest.allowedMethods()); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('koa starts at port 3000!'); })
用前面相似的方法进行请求,能够看到返回了以下数据,而且支持了post请求。
//jsonp接口 Object {api: "jsonp", info: Object} //restful接口 Object {api: "restful", info: Object}
到这里就所有完成了,我尽可能一点一点地浅显的写出来。实际上还有更多能够优化的地方:
并且咱们再一次看到,学习koa其实就是各类中间件和api的学习罢了。
最后写一下须要install的库:(虽然能够经过require推测出来)
"@koa/cors": "^2.2.1", "koa": "^2.5.1", "koa-bodyparser": "^4.2.0", "koa-logger": "^3.2.0", "koa-router": "^7.4.0", "yamljs": "^0.3.0"
本文代码存放在个人github的blog_server仓库的demo文件夹里面。