《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
请看下面这段代码:
7 | var http = require( "http" ); |
11 |
"提示信息" : "欢迎参加《一个周末掌握IT前沿技术》的极限学习活动!" |
16 |
function (request, response) { |
18 |
response.writeHead(200, { |
19 |
"Content-Type" : "application/json; charset=UTF-8" |
21 |
response.write(JSON.stringify(result)); |
23 |
console.log( "服务器访问被访问次数: i = " + i); |
我们通过浏览器就可以访问它,结果如下图所示。
![rest](https://i-blog.csdnimg.cn/blog_migrate/c6bb6967b1cf5ccd08f8cec9f1bec658.jpeg)
4.2 实现简单的路由机制
高效率的RESTful请求都倾向于使用HTTP GET方法。GET请求的所有信息都携带在请求地址url中。在Node.js里读取request.url可以获得请求的url,我们需要对不同的url做路由处理,返回不同的响应数据。Node.js有一个轻量级框架Express,它实现了一个比较好的路由机制,只是他不在我们的学习范围之中。我们需要的是能够处理下面路由表的高效的路由机制。
例程6:
handlesmap.js如下:
5 | var requestHandles = require( "./requestHandles" ); |
9 |
"/api/*" :requestHandles.test1, |
10 |
"/api/test1" :requestHandles.test1, |
11 |
"/api/test2/:id" :requestHandles.test2, |
12 |
"/api/test3" :requestHandles.test3 |
22 | module.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的部分内容如下:
2 | requestHandles.test3 = function (request, response, pathObject, queryobj) { |
3 |
response.write( "{b:{p:'我是test3'}}" ); |
5 | module.exports = requestHandles; |
我们将4.1节的例子稍微改一下使用路由处理,连接路由表和处理器,这时demo6.js如下:
6 | var http = require( "http" ); |
7 | var route = require( "./demo6lib/route" ); |
8 | var handlesmap = require( "./demo6lib/handlesmap" ); |
13 |
function (request, response) { |
15 |
response.writeHead(200, { |
16 |
"Content-Type" : "application/json; charset=UTF-8" |
20 |
route(handlesmap, request.url, request, response, queryobj); |
23 |
console.log( "服务器访问被访问次数: i = " + i); |
读懂这些代码,在webstorm上将这个例程运行起来,今天的学习内容就算完成了。想想今天的学习我们是有多么的高效。回想一下,JSON、闭包性、redis、nTenjin、RESTful,这些东西是不是还清晰?这些东西都是快速构建现代高性能的web应用服务的基础元素。我们没有提到任何框架,甚至于Node.js的Express框架都没有涉及。我们可以思考,在这个技术更新如此迅速的网络时代,我们如何提高生产力?是需要更强大的工具,还是更大粒度的模块,是更复杂更强大的框架,还是更简单更直接的流程,亦或是对整体更加系统化的认识?
来源:http://ittechnical.sinaapp.com/node-js-and-restful-api/