Node.js与Restful API

来源:互联网 发布:4g网络架构 编辑:程序博客网 时间:2024/05/17 01:43
《REST规范》
总结REST有两个最重要的原则:
1.分离性;交互的客户端和服务器除了RESTful-API没有其他的依赖关系,限制了整个系统的复杂性,促进了各个部分的独立性。
2.无状态性:客户端和服务器之间的交互在请求之间是无状态的,从客户端到服务器的每个请求都必须包含理解请求所必需的信息。

满足上面规范的API接口就是RESTful-API。客户端常常通过HTTP方法(GET、POST、PUT、DELETE等),来发送API请求;服务端常常以JSON数据作为响应。做好web开发,我们必须非常深刻地理解http/TCP/IP协议栈。我们可以通过浏览器访问发送HTTP GET请求,通过浏览器Ajax对象发送HTTP请求,也可以通过一些特殊的工具模拟浏览器发送请求。收到请求后响应JSON数据的服务器就是RESTful-API服务器。上一章我们提到了PHP框架CodeIgniter。下面这篇文章可以教我们如何使用CodeIgniter搭建RESTful-API服务。
《在CodeIgniter框架中使用RESTful服务》
python的tornado也是一种优秀的Web服务器框架,类似于Node.js它也采用epoll非阻塞IO,响应快速,可处理数千并发连接,非常适用用于实时的Web服务,并发性能和Node.js不相伯仲。只是它对JSON数据的集成度不如Node.js,对中文字符的支持也不好,开发效率不如Node.js。下面我们通过一个例程来学习怎样使用Node.js开发RESTful-API服务。


四. Node.js与 RESTful-API


我们先用noed.js搭建一个最简单的RESTful-API服务器


4.1 最简单的RESTful-API

请看下面这段代码:

查看源代码
打印帮助
1/**
2* Date: 12-3-24
3* 说明: 最简单的RESTful-API Server
4* 请求:http://127.0.0.1:8080/testapi
5* 响应:{"访问成功":{"提示信息":"欢迎参加《一个周末掌握IT前沿技术》的极限学习活动!"}}
6*/
7var http = require("http");
8var i = 1;
9result = {
10"访问成功": {
11"提示信息": "欢迎参加《一个周末掌握IT前沿技术》的极限学习活动!"
12}
13}
14
15http.createServer(
16function(request, response) {
17
18response.writeHead(200, {
19"Content-Type": "application/json; charset=UTF-8"
20});
21response.write(JSON.stringify(result));
22i++;
23console.log("服务器访问被访问次数: i = "+ i);
24response.end();
25
26}).listen(8080);
27
28console.log("服务器开启");

我们通过浏览器就可以访问它,结果如下图所示。


4.2 实现简单的路由机制

高效率的RESTful请求都倾向于使用HTTP GET方法。GET请求的所有信息都携带在请求地址url中。在Node.js里读取request.url可以获得请求的url,我们需要对不同的url做路由处理,返回不同的响应数据。Node.js有一个轻量级框架Express,它实现了一个比较好的路由机制,只是他不在我们的学习范围之中。我们需要的是能够处理下面路由表的高效的路由机制。
例程6:
handlesmap.js如下:

查看源代码
打印帮助
1/**
2* Date: 12-3-24
3* 说明: RESTful-API web请求url路由表
4*/
5var requestHandles = require("./requestHandles");
6
7var handlesmap = {
8"get":{
9"/api/*":requestHandles.test1,
10"/api/test1":requestHandles.test1,
11"/api/test2/:id":requestHandles.test2,
12"/api/test3":requestHandles.test3
13},
14"post":{
15},
16"put":{
17},
18"del":{
19}
20};
21
22module.exports = handlesmap;

这个路由表的含义很简单,那就是如果访问请求url形如:http://127.0.0.1:8080/api/test1,则交给函数requestHandles.test1处理。如果形如:http://127.0.0.1:8080/api/test2/user1,则交给函数requestHandles.test2处理,/api/test2/后面的转义字符串赋值给变量id,一起传给处理函数。至于路由处理的模块(route.js),大家可以在例程的源代码中找到。它使用很简单的字符串处理,功能比较有限。哪位朋友如果有兴趣,可以写个更强大的,使用正则表达式的route。Express的路由机制用的就是正则表达式实现。功能强大,效率高,就是套用框架稍微有一点复杂。它的处理器(handles)就是普通的函数。
requestHandles.js的部分内容如下:

查看源代码
打印帮助
1//<!-- 省去很多内容 -->
2requestHandles.test3 = function(request, response, pathObject, queryobj) {
3response.write("{b:{p:'我是test3'}}");
4}
5module.exports = requestHandles;

我们将4.1节的例子稍微改一下使用路由处理,连接路由表和处理器,这时demo6.js如下:

查看源代码
打印帮助
1/**
2* Date: 12-3-24
3* 演示程序6
4* 说明: RESTful-API Server
5*/
6var http = require("http");
7var route = require("./demo6lib/route");
8var handlesmap = require("./demo6lib/handlesmap");
9
10var i = 1;
11
12http.createServer(
13function(request, response) {
14
15response.writeHead(200, {
16"Content-Type":"application/json; charset=UTF-8"
17});
18
19queryobj = {};
20route(handlesmap, request.url, request, response, queryobj);//路由处理
21
22i++;
23console.log("服务器访问被访问次数: i = "+ i);
24response.end();
25
26}).listen(8080);
27
28console.log("服务器开启");

读懂这些代码,在webstorm上将这个例程运行起来,今天的学习内容就算完成了。想想今天的学习我们是有多么的高效。回想一下,JSON、闭包性、redis、nTenjin、RESTful,这些东西是不是还清晰?这些东西都是快速构建现代高性能的web应用服务的基础元素。我们没有提到任何框架,甚至于Node.js的Express框架都没有涉及。我们可以思考,在这个技术更新如此迅速的网络时代,我们如何提高生产力?是需要更强大的工具,还是更大粒度的模块,是更复杂更强大的框架,还是更简单更直接的流程,亦或是对整体更加系统化的认识?

 

来源:http://ittechnical.sinaapp.com/node-js-and-restful-api/

原创粉丝点击