概述

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

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

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

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

建一个服务器

首先用koa来建一个服务器,在这个过程中,我们用到了koa-logger中间件,它会在服务端显示各种请求操作记录,便于我们开发和调试。

//app.js
'use strict'
const Koa = require('koa');
const logger = require('koa-logger'); const app = new Koa(); app.use(logger()); app.listen(3000, () => {
console.log('koa starts at port 3000!');
})

注意:如果不能运行的话,就换一个端口!

babel

根据官网文档,如果node版本大于7.6,就可以无痛使用async方法,否则要加入babel-register库和transform-async-to-generator库,并且在app.js里面加入如下代码:

require('babel-register');

而且要在.babel文件中,至少有如下代码:

{
"plugins": ["transform-async-to-generator"]
}

路由

我们需要给jsonp的API新建一个路由,这样就不影响其它路由了。(我们可能会在其它路由搭建restful api,也可能在其它路由搭建静态页面等等。)

'use strict'
const Koa = require('koa');
const logger = require('koa-logger');
const Router = require('koa-router'); const app = new Koa(); app.use(logger()); // 子路由1:主页
let routerHome = new Router();
routerHome.get('/', async (ctx) => {
ctx.body = '欢迎欢迎!';
}) // 子路由2:jsonp api
let routerJsonp = new Router();
routerJsonp.get('/data1', async (ctx) => {
ctx.body = '数据';
}) // 装载所有路由
let router = new Router();
router.use('/', routerHome.routes(), routerHome.allowedMethods());
router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods());
app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => {
console.log('koa starts at port 3000!');
})

现在,先用node运行app.js文件,然后用浏览器访问http://localhost:3000/会看到欢迎欢迎四个字,访问http://localhost:3000/jsonp/data1会看到数据两个字。

jsonp

jsonp的机制是,我们传给服务器一个callback参数,值是我们要调用的函数名字,然后服务器返回一个字符串,这个字符串不仅仅是需要返回的数据,而且这个数据要用这个函数名字包裹。

所以我们需要做如下事情:

  1. 解析请求所带的参数,并且读取callback参数的值。解决方法是,我们用ctx.request.query获得请求所带的所有参数,然后读取出callback参数:ctx.request.query.callback。
  2. 把数据转化为字符串,并用这个函数名包裹。这个很简单,字符串连接即可。

代码如下:

'use strict'
const Koa = require('koa');
const logger = require('koa-logger');
const Router = require('koa-router'); const app = new Koa(); app.use(logger()); // 子路由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 + '(' + '"数据"' + ')';
}) // 装载所有路由
let router = new Router();
router.use('/', routerHome.routes(), routerHome.allowedMethods());
router.use('/jsonp', routerJsonp.routes(), routerJsonp.allowedMethods());
app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => {
console.log('koa starts at port 3000!');
})

最后用node运行app.js文件就大功告成了!!!我们首先在控制台引入jquery库,然后调用jquery的ajax方法,进行jsonp请求,就能获得“数据”了。

首先我们在浏览器的控制台引入jquery库:

var myScript = document.createElement('script');
myScript.src = 'https://cdn.bootcss.com/jquery/3.3.1/jquery.js';
document.getElementsByTagName('head')[0].appendChild(myScript);

然后用ajax方法进行jsonp跨域请求数据,就可以在控制台看到“数据”二个字了。

$.ajax({
url : 'http://localhost:3000/jsonp/data1',
dataType : 'jsonp',
type : 'get',
success : function(res){
console.log(res);
},
error: function() {
alert("网络出现错误,请刷新!");
}
});

注意:由于原页面是http页面,所以不能在https页面进行jsonp跨域请求。找一个http页面进行jsonp跨域请求测试吧。

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

  1. 利用koa打造restful API

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

  2. 利用有道翻译Api实现英文翻译功能

    有道翻译提供了翻译和查词的数据接口.通过数据接口,您可以获得一段文本的翻译结果或者查词结果.       通过调用有道翻译API数据接口,您可以在您的网站或应用中更灵活地定制翻译和查词功能. 第一步: ...

  3. 利用Swashbuckle生成Web API Help Pages

    利用Swashbuckle生成Web API Help Pages 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: ...

  4. 怎样利用App打造自明星实现自盈利

    怎样利用App打造自明星实现自盈利 1.了解各个概念       为了大家都能看懂这篇文章,先说明几个概念.        App(Application):能够在移动设备上使用,满足人们咨询.购物. ...

  5. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库

    原文:如何利用[百度地图API],制作房产酒店地图?(下)--结合自己的数据库 摘要:应广大API爱好者要求,写了一篇利用自己数据库标点的文章…… -------------------------- ...

  6. 如何利用【百度地图API】进行定位?非GPS定位

    原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------- ...

  7. 利用Swashbuckle生成Web API Help Pages

    利用Swashbuckle生成Web API Help Pages 本文将通过Swagger的.NET Core的实现封装工具Swashbuckle来生成上一篇-<创建ASP.NET Core ...

  8. Web Api 内部数据思考 和 利用http缓存优化 Api

    在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一  实际使用应该返回怎样的数据 ? ...

  9. 利用 Android 系统原生 API 实现分享功能

    利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...

随机推荐

  1. Reading CLR via c# 4th Edition

    In fact, at runtime, the CLR has no idea which programming language the developer used for thesource ...

  2. 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)

    传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...

  3. IBM X3650 M3/M4的服务器装系统

    IBM X3650 M3/M4的服务器一般都有两块以上的硬盘.所以如果没有做RAID,那首先应该做好raid 磁盘阵列.本文装系统的前提是RAID已经做好. 一般安装系统的方式为先在IBM官网下载对应 ...

  4. git常规命令

    $ mkdir filename 创建一个空目录 $ git init 把这个目录变成Git可以管理的仓库 $ pwd 用于显示当前目录 $ cat <file> 查看文件内容 $ git ...

  5. vs2015转到定义没反应

    开始菜单 -->所有程序-->Visual Studio 文件夹 --> Visual Studio Tools -->VS2015开发人员命令提示输入DOS命令: CD Co ...

  6. Mybatis-Plus 实战完整学习笔记(七)------select测试二

    1.查询selectOne  (3.0.3版) @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

  7. python(1)在windows8.1下搭建python27和python36环境

    去Python官网下载需要的Python版本 https://www.python.org/ 我下载的是下面这两个版本: Python 2.7.13 Python 3.6.1 安装Python27时, ...

  8. linux 修改ip 地址

    1./etc/sysconfig/network-scripts/ifcfg-网卡 如果是新网卡 自己写配置文档 ip a 即可查看网卡名字 (这是eno16777736) BOOTPROTO= dh ...

  9. USTC《现代软件工程》春季学期——第一次个人作业:词频统计

    截止日期 2018年3月29日23:59 要求 1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数. ...

  10. Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)

    奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...