最近學習利用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文件夾裏面。