美文网首页
关于node中数据交互的理解

关于node中数据交互的理解

作者: 似朝朝我心 | 来源:发表于2021-06-18 00:02 被阅读0次

什么是数据交互?

数据交互是httpd协议中常见的,数据交互顾名思义就是我把数据传输给你,你再把数据返回给我,这么一个过程其实就是数据交互。

数据交互里面的一些基本概念:

数据交互过程图:



根据上图的意思,无非就是用户在客户端的浏览器中上网,这一个上网打开链接的过程,其实就是访问一个具体url地址而要发起一个请求到服务器这一端来,而服务器这边拿到客户端发过来的请求,表示收到呼叫,稍等片刻,在这片刻之间呢,服务器就会去处理客户端发起请求的,然后把结果反馈给客户端,并且告诉客户端一声,这是你的用户需要的资料,浏览器当即进行解析把页面渲染出来,然后用户就看到了浏览器解析网页后所呈现出的内容了,上述的这么一个过程其实就是数据交互啦。

那么在数据交互的过程中到底发送了什么事情呢?
比如浏览器发送给服务器的这个数据到底是什么?
服务器返还给客户端的这个数据又是什么呢?

嘿嘿!其实,这个数据就叫报文,那报文又长啥样呢?

从浏览器发送给服务器的这个数据,我叫它请求报文,换言之还有一个响应报文。

请求报文拆解图:


如果我们用过ajax就知道,报文其实Network里面那个东东,分别对应请求头、请求体,还有响应头、响应体。

数据的交互方式,换个说法也可以叫数据的请求方式

常见的数据请求方式是:GET请求(完整请求一个资源)和POST请求(表单提交)

此外还有一些比较偏,或者比较冷,简单点就是平时基本用不到的数据请求方式:PUT(上传文件)、DELETE、PATCH(打补丁)、HEAD(仅请求响应首部)

什么是GET请求?

  • 从字面上理解,GET就是获取、获得、得到的意思。而GET()请求主要就是获取数据。
  • 发起GET请求,数据是放在url里面进行传输的,就像ajax里面的携带参数,专业点叫查询字符串,Query String,一段完整的url后面,出现了一个?,这个?符号后面就表示具体的携带信息,而&这个符号就是作参数拼接意思。
axios.get({
    url:'localhost:3000/api/goodsList?id=10023&page=1&limit=10'
})

回顾一下上面报文图,这里的url其实指的就是我们放在报文里面那个请求头位置的请求信息。

  • GET请求容量小,必须小于32KB,这是http协议规定的,因为这个规定,所以GET请求只允许传递少量的数据,比如一些数字、字符串等,如果想要传递图片格式的数据或者视频,GET请求确实有点捉襟见肘,必须采用POST请求。

当页面发起一个GET请求时,应如何拿到GET请求发送过来数据?

一个小demo,用到node中http模块来搭建服务器,而前端暂且使用表单发起GET请求。

前端界面:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:3000/api" method="GET">
        <table border="1"> 
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="userName"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交" style="width: 100%;"></td>
            </tr>
        </table>
    </form>
</body>
</html>

服务器:

const http = require('http')
//搭建服务器
http.createServer((req, res)=>{
    console.log(req.url);//拿到浏览器发起请求的路径
}).listen(3000)//监听端口号

运行服务器,当我们在客户端浏览器中提交表单后

PS C:\Users\asus\Desktop\学习Nodejs> node index
/api?userName=qinfubin&password=123456

如果我们想拿到这些数据,可以通过es6语法的解构赋值去获取,用split()方法去切一刀,返回一个字符串数组

const http = require('http')
//搭建服务器
http.createServer((req, res)=>{
    console.log(req.url);//拿到浏览器发起请求的路径
    let [url,queryString] = req.url.split('?') //以?号切一刀,返回1个字符串数组分别赋值给url和queryString
    console.log(url)
    console.log(queryString);
    let [user_name,passwd] = queryString.split('&')
    console.log(`用户名:${user_name},密码:${passwd}`);
}).listen(3000)//监听端口号

但在node中有一个url模块,有了它,我们就不需要去用split()去砍一刀又一刀,然后再结构赋值,我们为什么不用现成的呢?

const http = require('http')
const url = require('url')
//搭建服务器
http.createServer((req, res)=>{
    console.log(url.parse(req.url));//拿到浏览器发起请求的路径进行解析
}).listen(3000)//监听端口号

如果我们再增加一个参数:true,这样我们就直接可以拿到一个json对象

console.log(url.parse(req.url,true));

接下来我们只需要结构赋值,将json里面的数据值取出来即可

const http = require('http')
const url = require('url')
//搭建服务器
http.createServer((req, res)=>{
    //console.log(url.parse(req.url,true));;//拿到浏览器发起请求的路径进行解析
    const {pathname, query} = url.parse(req.url,true)
    console.log(`请求的路径pathname是:${pathname},用户名:${query.userName},密码:${query.password}`);
}).listen(3000)//监听端口号

POST请求和GET请求的区别在哪里?

我们知道无论是GET方式还是POST方式,它们共同的特点就是都可以发起请求,并且还可以进行传递数据。

而POST方式相比于GET方式,具体有哪些区别呢?

  • 数据是放在body里面进行传输的。
  • 具有小于2G的传递数据空间,传输容量大,是POST传递数据方式最明显的特点,这也意味着,传输一些视频或者图片格式的文件绰绰有余。
  • 因为GET方式传递数据容量小,所以是一次性传输,而POST方式不一样,比如传递一个文件,因为数据量大,它会分成一段一段地进行传输二进制的buffer流。

demo案例
前端界面:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:3000/api" method="POST">
        <table border="1"> 
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="userName"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交" style="width: 100%;"></td>
            </tr>
        </table>
    </form>
</body>
</html>

服务器:

const http = require('http')
const queryString = require('querystring')
//搭建服务器
http.createServer((req, res)=>{
    let result = []
    req.on('data',buffer => { //监听buffer流动过程
        result.push(buffer)//将每次流过的都添加到数组中
    })
    req.on('end', () =>{//进行最后一次buffer流动的监听
        console.log('数据已经传输完成',result);
    })
}).listen(3000)//监听端口号

拿到的只是二进制的buffer流,我们需要转换成字符串的形式,才能看懂。

const http = require('http')
const queryString = require('querystring')
//搭建服务器
http.createServer((req, res)=>{
    let result = []
    req.on('data',buffer => { //监听buffer整个流动过程
        result.push(buffer)//将每次流过一段buffer流的都添加到数组中
    })
    req.on('end', () =>{//进行最后一次buffer流动的监听
        //console.log('数据已经传输完成',result);
        let data = Buffer.concat(result).toString()//将二进制的buffer流解析成字符串
        console.log(data);
        console.log(queryString.parse(data)); //解析成json对象
        
    })
}).listen(3000)//监听端口号

接下来只需要取出值即可

const http = require('http')
const queryString = require('querystring')
//搭建服务器
http.createServer((req, res)=>{
    let result = []
    req.on('data',buffer => { //监听buffer整个流动过程
        result.push(buffer)//将每次流过一段buffer流的都添加到数组中
    })
    req.on('end', () =>{//进行最后一次buffer流动的监听
        //console.log('数据已经传输完成',result);
        const data = Buffer.concat(result).toString()//将二进制的buffer流解析成字符串
        //console.log(data);
        //console.log(queryString.parse(data)); //解析成json对象
        const userName =  queryString.parse(data).userName;//取出用户名
        const password =  queryString.parse(data).password;//取出密码
        console.log(userName,password);
    })
}).listen(3000)//监听端口号

相关文章

  • 关于node中数据交互的理解

    什么是数据交互? 数据交互是httpd协议中常见的,数据交互顾名思义就是我把数据传输给你,你再把数据返回给我,这么...

  • Node中的数据交互

    GET 请求,用来获取数据 数据放在URL里进行传输 容量 < 32K 看例子:我们先创建一个服务器,监听8888...

  • 第四章 node初步的了解

    Node.js与Express负责后台处理AngularJS负责网页交互MongoDB负责数据存储 Node.js...

  • 【面试题】service和activity怎么进行数据交互?

    参考:Android中Service与Activity数据交互的简单理解android service和activ...

  • 前后台交互的学习(Java web)

    标签:前后端交互Javaweb 下面介绍了一些关于交互的细节: 1.请求数据 前端提供请求数据。 在开发中,后台在...

  • 2022-08-18 node 与 python 交互

    node与python交互,可以使用 python-shell 。 用法: node中: python: 更多用法...

  • es

    Cluster包含多个node,Indices不应该理解成动词索引,Indices可理解成关系数据库中的datab...

  • topic 通讯与自定义 msg 类型

    引言 ROS 中各个 node 通过 topic 传输数据。topic 可以直观理解成通讯管道,每个 topic...

  • 关于数据交互

    express/axios 获取不到header中的某些字段 问题:axios响应拦截中,取不到后端配置在head...

  • Node.js中的事件循环

    看到很多文件介绍关于Node.js中的事件循环,但是总是有些地方不是很理解,最近无意中看到了Node官方文档中对事...

网友评论

      本文标题:关于node中数据交互的理解

      本文链接:https://www.haomeiwen.com/subject/lzchyltx.html