• nodeJS入门04-post请求


    post请求

    POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。

    比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。

    一个post请求的小实例:(代码地址:https://github.com/xuxiaozhi/nodeJS-tutorial.git

    前端代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="http://127.0.0.1:8080/dopost" method="post">
        <p>姓名:<input type="text" name="name"></p>
        <p>年龄:<input type="text" name="age"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

    服务端代码:

    var http=require("http");
    var queryString=require("querystring");
    var server=http.createServer(function (req,res) {
        if(req.url=="/dopost"&&req.method.toLocaleLowerCase()=="post"){
    
            // 定义了一个post变量,用于暂存请求体的信息
            var allData="";
    
            //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
            req.addListener("data",function (chunk) {
                allData+=chunk;
            })
    
            //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
            req.addListener("end",function () {
                var dataString=allData.toString();
                var dataObj=queryString.parse(dataString);
                res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"})
                res.write(dataObj.name+"的年龄是:"+dataObj.age);
                res.end();
            })
        }
    })
    
    server.listen(8080,"127.0.0.1");

    运行结果:

    原生写POST处理,比较复杂,要写两个监听。文件上传业务比较难写。所以,我们用到第三方模块。formidable。

    api地址:https://www.npmjs.com/package/formidable

     因为这个是一个第三方的模块,所以我们在使用到这个模块的时候需要先安装这个模块 :安装这个模块用的是npm install formidable命令

    cmd命令:

     安装好之后,我们在我们的项目里面,会看到一个node_modules文件夹,下载的模块就在这个文件夹中,如下:

     

     上面的例子用formidable来监听提交数据

    var http=require("http");
    var queryString=require("querystring");
    var formidable=require("formidable");
    var server=http.createServer(function (req,res) {
        if(req.url=="/dopost"&&req.method.toLocaleLowerCase()=="post"){
            // parse a file upload
            var form = new formidable.IncomingForm();
             //执行里面的回调函数的时候,表单已经全部接收完毕了
            //所有的文本域,单选框,都在fields存放
            //所有的文件域,files
            form.parse(req, function(err, fields, files) {
                console.log(fields);
                console.log(files);
                res.writeHead(200, {'content-type': 'text/plain'});
                res.end();
            });
    
            return;
        }
    })
    
    server.listen(8080,"127.0.0.1");
  • 相关阅读:
    《算法竞赛进阶指南》0x00 Hamiton路径 位运算
    HDOJ1170二叉树的遍历 经典问题
    HDOJ1527博弈论之Wythoff游戏
    HDOJ1848NIM博弈 SG函数
    CRC校验码
    Delphi DBGrid 获取焦点几行和几列
    程序进制 常用简写标识
    Delphi 转换函数 HexToBin用法 将16进制字串转成二进制
    细胞-红细胞
    细胞-白细胞-中性粒细胞
  • 原文地址:https://www.cnblogs.com/xuxiaozhi/p/7928524.html
Copyright © 2020-2023  润新知