加入现在我们想用node创建一个待办事项的清单的web服务,设计到典型的创建,读取,更新和删除,操作。
用HTTP的谓词如GET,POST,PUT和DELETE,分别跟URL指定的资源的获取,创建,更新,移除相对应。
当Node的HTTP解析器读入并解析请求数据时,它会讲数据做成data的形式,把解析好的数据块放在其中,等待程序处理。
用POST请求创建资源
var http = require('http');
var url = require('url');
var items = [];
var server = http.createServer(function (req,res) {
switch(req.method){
case 'POST':
var item = '';//为进来的事项设置字符串缓存
req.setEncoding('utf8');
req.on('data',function (chunk) {
item += chunk;
});
req.on('end',function () {
items.push(item);//将完整的新事项压入事项数组中,记录事项
res.end('OK\n');
});
break;
})
server.listen(3000,'127.0.0.1');
console.log("开始监听端口");
默认情况下,data事件会提供Buffer对象,这是 Node版的字节数组。而对于文本格式的待办事项而言,并不需要二进制数据,所以最好将流编码设定为ascii或者utf8;这样data事件会给出字符串。我们可以通过req.setEncoding(encoding)设置
用GET请求获取资源
...
case 'GET':
var body = items.map(function (item,i) {
return i + ')' + item
}).join('\n');
res.setHeader('Content-Length',Buffer.byteLength(body));
res.setHeader('Content-Type','text/plain;charset="utf-8"');
res.end(body);
break;
设定Content-Length头
为了提高响应速度,如果可以,应该在响应头中带着Content-Length域一起发送。对于事项清单而言,响应主体很容易在内存中提前构建好,所以你能得到字符串长度并一次性将整个清单都发送出去。设定Content-Length域会隐含禁用Node的块编码,因为要传输的额数据更少,所以提升性能。
用DELETE请求移除资源
case 'DELETE':
var path = url.parse(req.url).pathname;
var i = parseInt(path.slice(1),10);
if(isNaN(i)){
res.statusCode = 400;
res.end('Invalid item id');
}else if(!items[i]){
res.statusCode = 404;
res.end('Item not found');
}else{
items.splice(i,1);
res.end('OK\n');
}
break;
url.parse()只能帮我们解析出pathname,但是我们需要在程序中使用这个ID数值。简单的做法是用String.slice()
最终我们可以通过curl命令来查看各接口情况:
curl -d 'buy a pen' http://localhost:3000 //创建资源
curl http://localhost:3000 //获取资源
curl -v -X DELETE -d 'buy a pencil' http://localhost:3000/0 //删除某个事项
curl -v -X PUT -d 'save money' http://localhost:3000
//修改某个事项