越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp)。再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式,看起来比较相近,但在底层差别还是比较大的(本文只写服务端的实现)。
为了便于讲解我使用express框架来运行我的demo。并分别讲解如何获取参数,并返回结果。本文相当于一个基础篇,只写了一些常见的应用场景。漏掉一些复杂的场景,还望提醒。
一、Ajax——post请求
之所以先从post开始,是因为我想把get和jsonp挨的比较近一些。而且post获取参数的方式和两外两种相比差别比较大。
一个基本的post请求:
1 var express = require('express');var router = express.Router(); 2 3 router.post('/simplePost', function (req, res, next){ 4 var param = req.body; 6 //console.log(param); 7 //todo something 9 res.json({"errorCode": 0,"errorMessage": 'save'}); 11 });
router是框架中定义路由的对象,我们相当于在router上绑定对应controller的回调函数。回调函数中会传入3个变量,分别封装了请求(req)、响应(res)和下一个中间件(next)。在post请求中参数被封装在req中的req.body 我们 console.log(param); 就可以在控制台看到参数了。通过一系列操作,当我们想返回结果(通常为json)的时候,就需要调用res下的json来将一个对象返回客户端(前端)。
二、Ajax——get请求
get 请求和post大体相近,但略有不同。不多说,先看代码:
1 var express = require('express'); 2 var router = express.Router(); 3 var urllib = require('url'); 4 5 router.get('/simpleGet', function (req, res, next){ 6 var params = urllib.parse(req.url, true); 7 //console.log('params',params); 8 var query = params.query; 9 // todo something 10 res.json({"errorCode": 0,"errorMessage": 'save OK'}); 11 });
get请求的参数不可以直接在req.body中取出,要想获取参数就要先加载“url”模块 var urllib = require('url'); 通过模块封装的方法parse取出包含参数的对象,并将query取出,这是打印query,就可以看到前端发来的参数了。至于返回结果,就合post一样了。
三、jsonp
jsonp实际上发出的是一个js文件请求,所以本质上是get请求(但不是Ajax)。jsonp在获取参数这块和get(ajax)是一样的。但不同在与返回结果的方式。
1 var express = require('express'); 2 var router = express.Router(); 3 var urllib = require('url'); 4 5 router.get('/simpleJsonp', function (req, res, next){ 6 var params = urllib.parse(req.url, true); 7 var reqData = {}; 8 var query = params.query; 9 10 11 //res.send(reqData); 12 //console.log(params); 13 14 // todo somthing 15 if(params.query && params.query.callback){ 16 var str = params.query.callback + '(' + JSON.stringify(reqData) + ')';//jsonp 17 res.end(str); 18 }else{ 19 res.end(JSON.stringify(reqData)); 20 } 21 });
我们需要在获取参数后判断有没有约定好的回调函数的属性名“callback” —— if(params.query && params.query.callback){}。如果没有我认为我可以按普通的get(ajax)来处理,反之我认为是jsonp。jsonp需要将“调用”的方式,将结果返回:
params.query.callback + '(' + JSON.stringify(reqData) + ')';
总结:
这样就完成了常用异步接口的盘点,文中都是一些常见的最基本的场景。但是这也是复杂场景的基石。文中不对的地方还望大家多多斧正。