zoukankan      html  css  js  c++  java
  • node.js入门(三)http数据解析

    在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。

    表单提交到服务器一般都使用 GET/POST 请求。

    1、由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。

    项目根目录新建server.js 和 form.html

    server.js

    const http = require('http')
    
    var server = http.createServer(function (req,res) {
        var get = {}
        if(req.url.indexOf("?") != -1){ // 判断是否有请求在操作
            var arr = req.url.split("?");
            // arr[0]=>地址   '/aaa'
            var url = arr[0]
            // arr[1]=>数据   'user=xxx&pass=xxx'
    
            var arr2 = arr[1].split("&")
            // arr2=>['user=xxx','pass=xxx']
    
            for(var i = 0;i < arr2.length; i++){
                var arr3 = arr2[i].split("=");
                get[arr3[0]] = arr3[1]
            }
        console.log(url,get)
        }else {
            var url = req.url
        }
    })
    server.listen(8080)
    

    form.html

    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/html">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="http://localhost:8080/aaa" method="get">
        用户:<input type="text" name="user"></br>
        密码:<input type="password" name="pass"> <br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    这样可以看到打印出请求的数据

    但是这里提取请求数据很不友好,nodejs提供了库querystring--查询字符串

    对上面的代码改造

    const http = require('http')
    const queryString = require("querystring")
    
    var server = http.createServer(function (req,res) {
        var get = {}
        if(req.url.indexOf("?") != -1){ // 判断是否有请求在操作
            var arr = req.url.split("?");
            var url = arr[0]
            get = queryString.parse(arr[1])
            console.log(url,get)
        }else {
            var url = req.url
        }
    })
    server.listen(8080)
    

    启动服务,提交表单可以看到打印和之前的一样

    但是还是要分隔url和参数,还是觉得麻烦,可以使用url模块

    再对代码改造

    const http = require('http')
    const urlLib = require("url")
    
    var server = http.createServer(function (req,res) {
        var obj = urlLib.parse(req.url,true)//第二个参数是是否解析参数
        var url = obj.pathname;
        var get = obj.query
        console.log(url,get)
    })
    server.listen(8080)
    

    上面就是get请求的处理了

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

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

    传输大数据可以全部一起传输,也可以分段传输

    const http = require('http')
    
    var server = http.createServer(function (req, res) {
        var str = "" // 接收数据(暂时)
        var i = 0
        // 有一段数据到达(很多段)
        req.on('data', function (data) { // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到str变量中
            console.log(`第${i++}次收到数据`)
            str += data
        })
        // 数据全部到达(一次)
        req.on('end', function () {
            // console.log(str)
        })
    })
    server.listen(8080)
    
    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/html">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="http://localhost:8080/aaa" method="post">
        用户:<input type="text" name="user"></br>
        密码:<input type="password" name="pass"> <br>
        <textarea name="content" id="" cols="30" rows="10"></textarea>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    在textarea输入大量的内容提交,可以看到打印的结果显示多少次接受到数据

    使用querystring解析数据

    const http = require('http')
    const queryString = require('querystring')
    
    var server = http.createServer(function (req, res) {
        var str = ""
        var i = 0
        // 有一段数据到达(很多段)
        req.on('data', function (data) {
            console.log(`第${i++}次收到数据`)
            str += data
        })
        // 数据全部到达(一次)
        req.on('end', function () {
            // 解析参数
            var post = queryString.parse(str)
            console.log(post)
        })
    })
    server.listen(8080)
    
  • 相关阅读:
    Android高手进阶教程(五)之----Android 中LayoutInflater的使用!
    APDPlat
    微博项目学习笔记
    iOS极光推送进一部使用(重点)
    iOS 打测试包
    自定义UICollectionViewFlowLayout
    解决UITableview 底部留白
    NSAttributedString 富文本样式
    OC排序算法
    CALayer,,,CATextLayer,,,CAShapeLayer,, CAGradientLayer
  • 原文地址:https://www.cnblogs.com/YAN-HUA/p/10824013.html
Copyright © 2011-2022 走看看