越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp)。再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式,看起来比较相近,但在底层差别还是比较大的(本文只写服务端的实现)。

  为了便于讲解我使用express框架来运行我的demo。并分别讲解如何获取参数,并返回结果。本文相当于一个基础篇,只写了一些常见的应用场景。漏掉一些复杂的场景,还望提醒。

一、Ajax——post请求

  之所以先从post开始,是因为我想把get和jsonp挨的比较近一些。而且post获取参数的方式和两外两种相比差别比较大。

  一个基本的post请求:

 var express = require('express');var router = express.Router();

 router.post('/simplePost', function (req, res, next){
var param = req.body;
//console.log(param);
//todo something
res.json({"errorCode": 0,"errorMessage": 'save'});
});

  router是框架中定义路由的对象,我们相当于在router上绑定对应controller的回调函数。回调函数中会传入3个变量,分别封装了请求(req)、响应(res)和下一个中间件(next)。在post请求中参数被封装在req中的req.body 我们 console.log(param); 就可以在控制台看到参数了。通过一系列操作,当我们想返回结果(通常为json)的时候,就需要调用res下的json来将一个对象返回客户端(前端)。

二、Ajax——get请求

  get 请求和post大体相近,但略有不同。不多说,先看代码:

 var express = require('express');
var router = express.Router();
var urllib = require('url'); router.get('/simpleGet', function (req, res, next){
var params = urllib.parse(req.url, true);
//console.log('params',params);
var query = params.query;
// todo something
res.json({"errorCode": 0,"errorMessage": 'save OK'});
});

  get请求的参数不可以直接在req.body中取出,要想获取参数就要先加载“url”模块   var urllib = require('url'); 通过模块封装的方法parse取出包含参数的对象,并将query取出,这是打印query,就可以看到前端发来的参数了。至于返回结果,就合post一样了。

三、jsonp

  jsonp实际上发出的是一个js文件请求,所以本质上是get请求(但不是Ajax)。jsonp在获取参数这块和get(ajax)是一样的。但不同在与返回结果的方式。

 var express = require('express');
var router = express.Router();
var urllib = require('url'); router.get('/simpleJsonp', function (req, res, next){
var params = urllib.parse(req.url, true);
var reqData = {};
var query = params.query; //res.send(reqData);
//console.log(params); // todo somthing
if(params.query && params.query.callback){
var str = params.query.callback + '(' + JSON.stringify(reqData) + ')';//jsonp
res.end(str);
}else{
res.end(JSON.stringify(reqData));
}
});

  我们需要在获取参数后判断有没有约定好的回调函数的属性名“callback”  ——  if(params.query && params.query.callback){}。如果没有我认为我可以按普通的get(ajax)来处理,反之我认为是jsonp。jsonp需要将“调用”的方式,将结果返回:

params.query.callback + '(' + JSON.stringify(reqData) + ')';

总结:

  这样就完成了常用异步接口的盘点,文中都是一些常见的最基本的场景。但是这也是复杂场景的基石。文中不对的地方还望大家多多斧正。

  

  

最新文章

  1. Eclipce结合Ant进行编译、打包、传输、运行
  2. mysql的查询、子查询及连接查询
  3. 运行时报错:java.net.BindException: Address already in use: JVM_Bind <null>:8080 (或8009或8005)
  4. cocos2d-x WebSocket
  5. androidstudio 配置git和github
  6. leetcode Add and Search Word - Data structure design
  7. Oracle中快速查询和操作某个用户下的所有表数据信息
  8. To do
  9. HttpWebRequest's Timeout and ReadWriteTimeout — What do these mean for the underlying TCP connection?
  10. ubuntu LVM
  11. 20151210 Jquery 学习笔记 AJAX 进阶
  12. 出现Deprecated: Function ereg_replace() is deprecated in 的原因及解决方法
  13. Scrapy运行错误:ImportError: No module named win32api
  14. 从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”(转)
  15. pytest框架之命令行参数2
  16. leetcode每日刷题计划-简单篇day5
  17. RbbitMQ 的 python 实现方法
  18. 无实体反序列化Json
  19. 查询与删除MSSQL中所有外键约束
  20. 当强制关机时,出现Eclipse打不开的问题

热门文章

  1. app常见测试点
  2. ECharts基本设置
  3. Android Studio 2.2以上支持了Cmake的配置JNI的相关参数
  4. vue进阶 --- 实例演示
  5. css有关鼠标移动上去图片变透明度变化
  6. linux 编译安装php7
  7. C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题
  8. poj 3345 树形DP 附属关系+输入输出(好题)
  9. 将php代码部署到新浪云测试(简单方法,包含数据库的连接)
  10. python面试题——基础篇(80题)