神代綺凛の随波逐流

[Node.js] 笔记#1 Web 模块 | 收发 GET/POST


当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »

最近开始学 Node.js 了,写一写笔记,稍微记一下菜鸟教程上没有细讲的内容以及自己摸索的经验来巩固一下

这篇笔记包含 Web 模块的基本使用以及收发 GET/POST 请求的方法

Head Pic: 「無題」/「かるまゆ」[pixiv]

Node.js Web 模块

作服务端,接收请求

GET

var http = require('http');
var url = require('url');
var util = require('util');

//                     req请求  res返回
http.createServer(function(req, res){
    //writeHeader(状态码,响应头属性)
    res.writeHeader(200, {'Content-Type':'text/html;charset=UTF-8'});

    //解析 url 参数
    //parse() 将字符串转成对象,例如 req.url="/?url=123&name=321"
    //true:params 将是一个含有属性的对象{url:"123",name:"321"}
    //false:params 将是字符串"url=123&name=321"
    var params = url.parse(req.url, true).query;

    //使用 write() 向返回页面中输出内容
    res.write(params.url);
    res.write("<br>");
    res.write(params.name);

    //使用 end() 结束输出,必须要有 end()
    //可以带上参数:end("xxxxxx"),表示输出此内容之后结束输出
    res.end();
}).listen(8080);    //监听端口

POST

接收 POST 请求与 GET 请求不一样的一点就是,接收 POST 必须通过请求(req)的data事件来获取 POST 数据,然后通过end事件的回调函数来处理余下的任务

var http = require('http');
var querystring = require('querystring');

http.createServer(function (req, res) {
    //暂存请求体信息
    var body = "";

    //每当接收到请求体数据,累加到post中
    req.on('data', function (chunk) {
        //一定要使用+=,如果body=chunk,因为请求favicon.ico,body会等于{}
        body += chunk;
    });

    //数据接受完后,通过 querystring.parse 将 post 解析为真正的 POST 请求格式
    req.on('end', function () {
        //将一个字符串反序列化为一个对象
        body = querystring.parse(body);

        res.writeHead(200, {'Content-Type':'text/html;charset=utf8'});
        if(body.name && body.url) { // 输出提交的数据
            res.write(body.name);
            res.write("<br>");
            res.write(body.url);
        } else {
            res.write("xxxxxxx");
        }
        res.end();
    });
}).listen(8080);

作为客户端,发送请求并获取返回

GET

//如果需要发送 HTTPS 请求,则需要 require('https')
var http = require('http');

//发送 GET 请求  get(URL,回调函数)
http.get('http://xxx.xx', function(res) {
    //储存返回的 HTML 内容
    var html = '';
    //每收到一段数据就 += 一次
    res.on('data', function(data) {
        html += data;
    });

    //收到所有 HTML 内容后
    res.on('end', function() {
        //TODO
    });
});

POST

实际上上面的 GET 请求也可以用这里 POST 请求的方式来写,即使用http.request()而不是http.get(),但是直接用get()会简单很多

//如果需要发送 HTTPS 请求,则需要 require('https')
var http = require('http');
var querystring = require('querystring');

//POST 参数,直接写成一个对象
var contents = querystring.stringify({
    name:'Jindai Kirin',
    email:'jindaikirin@ykilin.moe',
    address:'lolico.moe'
});

//请求选项
var options = {
    host:'lolico.moe',
    path:'/xxx/xxx',
    method:'POST',
    headers:{
        'Content-Type':'application/x-www-form-urlencoded',
        'Content-Length':contents.length
    }
}

var req = http.request(options, function(res){
    var html = '';
    res.setEncoding('utf8');

    res.on('data',function(data){
        html += data;
    });

    res.on('end', function() {
        //TODO
    });
});

//发送请求
req.write(contents);
req.end;