构建RESTful Web服务

加入现在我们想用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
//修改某个事项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值