概述

最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用。

就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获得数据;另一种是restful API,前端通过fetch或者axios进行cors请求来获得数据。

本篇博文记录我用koa打造的jsonp API

可以先查看我的上一篇文章:利用koa打造jsonp API

参考资料:《Koa2进阶学习笔记》KOA docs

restful API

其实搭建restful API很简单,引入cors中间件即可,不需要设置请求头为Access-Control-Allow-Origin,这个中间件会自动帮我们设置。我们先引入中间件,然后重开一个路由存放restful API即可,代码如下:

  1. 'use strict'
  2. const Koa = require('koa');
  3. const logger = require('koa-logger');
  4. const Router = require('koa-router');
  5. const cors = require('@koa/cors');
  6. const app = new Koa();
  7. app.use(logger());
  8. app.use(cors());
  9. // 子路由1:主页
  10. let routerHome = new Router();
  11. routerHome.get('/', async (ctx) => {
  12. ctx.body = '欢迎欢迎!';
  13. })
  14. // 子路由2:jsonp api
  15. let routerJsonp = new Router();
  16. routerJsonp.get('/data1', async (ctx) => {
  17. let cb = ctx.request.query.callback;
  18. ctx.type = 'text';
  19. ctx.body = cb + '(' + '"数据"' + ')';
  20. })
  21. // 子路由3:restful api
  22. let routerRest = new Router();
  23. routerRest.get('/data1', async (ctx) => {
  24. ctx.body = 'rest数据';
  25. })
  26. // 装载所有路由
  27. let router = new Router();
  28. router.use('/', routerHome.routes(), routerHome.allowedMethods());
  29. router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods());
  30. router.use('/restful', routerRest.routes(), routerRest.allowedMethods());
  31. app.use(router.routes()).use(router.allowedMethods());
  32. app.listen(3000, () => {
  33. console.log('koa starts at port 3000!');
  34. })

然后利用下面的请求代码,就会在控制台输出“rest数据”

  1. $.ajax({
  2. url : 'http://localhost:3000/restful/data1',
  3. type : 'get',
  4. success : function(res){
  5. console.log(res);
  6. },
  7. error: function() {
  8. alert("网络出现错误,请刷新!");
  9. }
  10. });

改进

不得不说,我们的api是非常简陋的,我们考虑对它做如下改进:

  1. 支持post请求。这个很好办,在路由那里添加post方法即可。
  2. 支持yaml数据导入,然后通过api,把数据作为resonse发送出去。这个需要2步操作,第一步用node导入并解析yaml数据为对象,第二步把对象转化为字符串传递出去。第一步需要用到fs库和yamljs库,第二步需要用到JSON.stringify方法。具体代码如下:

首先支持post请求:

  1. 'use strict'
  2. const Koa = require('koa');
  3. const logger = require('koa-logger');
  4. const Router = require('koa-router');
  5. const cors = require('@koa/cors');
  6. const app = new Koa();
  7. app.use(logger());
  8. app.use(cors());
  9. // 子路由1:主页
  10. let routerHome = new Router();
  11. routerHome.get('/', async (ctx) => {
  12. ctx.body = '欢迎欢迎!';
  13. })
  14. // 子路由2:jsonp api
  15. let routerJsonp = new Router();
  16. routerJsonp.get('/data1', async (ctx) => {
  17. let cb = ctx.request.query.callback;
  18. ctx.type = 'text';
  19. ctx.body = cb + '(' + '"数据"' + ')';
  20. }).post('/data1', async (ctx) => {
  21. let cb = ctx.request.query.callback;
  22. ctx.type = 'text';
  23. ctx.body = cb + '(' + '"数据"' + ')';
  24. })
  25. // 子路由3:restful api
  26. let routerRest = new Router();
  27. routerRest.get('/data1', async (ctx) => {
  28. ctx.body = 'rest数据';
  29. }).post('/data1', async (ctx) => {
  30. ctx.body = 'rest数据';
  31. })
  32. // 装载所有路由
  33. let router = new Router();
  34. router.use('/', routerHome.routes(), routerHome.allowedMethods());
  35. router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods());
  36. router.use('/restful', routerRest.routes(), routerRest.allowedMethods());
  37. app.use(router.routes()).use(router.allowedMethods());
  38. app.listen(3000, () => {
  39. console.log('koa starts at port 3000!');
  40. })

然后我们新建jsonp.data1.yaml文件作为jsonp API的原始数据,新建restful.data1.yaml作为restful API的原始数据。

  1. //jsonp.data1.yaml
  2. api: "jsonp"
  3. info:
  4. version: "0.0.1"
  5. title: test for jsonp
  6. //restful.data1.yaml
  7. api: "restful"
  8. info:
  9. version: "0.0.1"
  10. title: test for restful

然后我们添加fs库(node自带,不需要install)和yamljs库进行导入和解析yaml文件,并且用JSON.stringify方法把json对象转化为字符串:

  1. 'use strict'
  2. const Koa = require('koa');
  3. const logger = require('koa-logger');
  4. const Router = require('koa-router');
  5. const cors = require('@koa/cors');
  6. const fs = require('fs');
  7. const YAML = require('yamljs');
  8. const app = new Koa();
  9. app.use(logger());
  10. app.use(cors());
  11. // 子路由1:主页
  12. let routerHome = new Router();
  13. routerHome.get('/', async (ctx) => {
  14. ctx.body = '欢迎欢迎!';
  15. })
  16. // 子路由2:jsonp api
  17. let routerJsonp = new Router();
  18. routerJsonp.get('/data1', async (ctx) => {
  19. let cb = ctx.request.query.callback;
  20. ctx.type = 'text';
  21. ctx.body = cb + '(' + JSON.stringify(YAML.parse(fs.readFileSync('./jsonp.data1.yaml').toString())) + ')';
  22. }).post('/data1', async (ctx) => {
  23. let cb = ctx.request.query.callback;
  24. ctx.type = 'text';
  25. ctx.body = cb + '(' + JSON.stringify(YAML.parse(fs.readFileSync('./jsonp.data1.yaml').toString())) + ')';
  26. })
  27. // 子路由3:restful api
  28. let routerRest = new Router();
  29. routerRest.get('/data1', async (ctx) => {
  30. ctx.body = YAML.parse(fs.readFileSync('./restful.data1.yaml').toString());
  31. }).post('/data1', async (ctx) => {
  32. ctx.body = YAML.parse(fs.readFileSync('./restful.data1.yaml').toString());
  33. })
  34. // 装载所有路由
  35. let router = new Router();
  36. router.use('/', routerHome.routes(), routerHome.allowedMethods());
  37. router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods());
  38. router.use('/restful', routerRest.routes(), routerRest.allowedMethods());
  39. app.use(router.routes()).use(router.allowedMethods());
  40. app.listen(3000, () => {
  41. console.log('koa starts at port 3000!');
  42. })

用前面类似的方法进行请求,可以看到返回了如下数据,并且支持了post请求。

  1. //jsonp接口
  2. Object {api: "jsonp", info: Object}
  3. //restful接口
  4. Object {api: "restful", info: Object}

其它

到这里就全部完成了,我尽量一点一点地浅显的写出来。实际上还有更多可以优化的地方:

  1. 支持匹配各种模糊的url路径
  2. 支持对传入参数进行处理。
  3. 支持https

而且我们再一次看到,学习koa其实就是各种中间件和api的学习罢了。

最后写一下需要install的库:(虽然可以通过require推测出来)

  1. "@koa/cors": "^2.2.1",
  2. "koa": "^2.5.1",
  3. "koa-bodyparser": "^4.2.0",
  4. "koa-logger": "^3.2.0",
  5. "koa-router": "^7.4.0",
  6. "yamljs": "^0.3.0"

本文代码存放在我的github的blog_server仓库的demo文件夹里面。

利用koa打造restful API的更多相关文章

  1. 利用koa打造jsonp API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  2. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  3. Springboot 如何加密,以及利用Swagger2构建Restful API

    先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...

  4. 利用Django实现RESTful API(一)

    RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷.强大的方法,那就是 Dja ...

  5. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  6. Flask RESTful API搭建笔记

    之前半年时间,来到项目的时候,已经有一些东西,大致就是IIS+MYSQL+PHP. 所以接着做,修修补补,Android/iOS与服务器数据库交换用PHP, Web那边则是JS+PHP,也没有前后端之 ...

  7. DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API

    背景: 上一篇博文简单翻译了Orthanc官网给出的CodeProject上“利用Orthanc Plugin SDK开发WADO插件”的博文,其中提到了Orthanc从0.8.0版本之后支持快速查询 ...

  8. Spring Boot 入门系列(二十二)使用Swagger2构建 RESTful API文档

    前面介绍了如何Spring Boot 快速打造Restful API 接口,也介绍了如何优雅的实现 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zha ...

  9. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

随机推荐

  1. usart下位机输出使用printf的格式化技巧

    输出使用printf("0x%3X ", I2c_Buf_Write[i]);时,上位机接收过程,使用文本格式,显示结果如下 虽然是保留了三位的宽度,但是并不美观. 相比于使用pr ...

  2. oracle 大量连接导致数据库不能登录

    系统遇到过几次这种问题,一个系统申请的session数过大,导致数据库进程数满,无法连接的问题. pl sql develope 报的错误是:ORA-12170:TNS:链接超时 oracle用户登录 ...

  3. 824. Goat Latin

    class Solution { public: string toGoatLatin(string S) { S.push_back(' '); //add a space that the loo ...

  4. Linux下移植QT(2)---移植QT

    准备:ubantu12.04   内核 3.0.8(最好用同样的内核,3.2.0时没成功) 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc-4.4.6 QT版本5.4.2 ...

  5. boost-容器

    1.array array相当于是一个增加了STL容器接口的数组,但它不像vector等容器一样可以动态增长,如果需要动态变动array的容量可以使用boost::scoped_array.array ...

  6. vue的cli中自定义router

    1.安装router npm install vue-router 2.为了方便管理在components同级创建router文件夹 3.在文件夹中创建index.js文件,就是router文件 im ...

  7. GDAL读写矢量文件——Python

    在Python中使用OGR时,先要导入OGR库,如果需要对中文的支持,还需要导入GDAL库,具体代码如下.Python创建的shp结果如图1所示. 图1 Python创建矢量结果 #-*- codin ...

  8. android-基础编程-democoderjoy-架构篇

    设计这个demo很简单,针对每个控件放到一个listitem中去,主activity继承之listActivity,这样再override其单击效果进入到每个控件. 主界面流程 1.继承 MainAc ...

  9. _编程语言_C++_Lambda函数与表达式

    C++11提供了对匿名函数的支持,称为Lambda表达式函数 Lambda 表达式把函数看作对象.Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值 ...

  10. [php]PHP_函数收集

    //http://php.net/manual/en/control-structures.break.php //break ends execution of the current for, f ...