Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【通信】前端中的几类数据交互方式

【通信】前端中的几类数据交互方式

作者头像
前端修罗场
发布于 2023-10-07 10:28:08
发布于 2023-10-07 10:28:08
33102
代码可运行
举报
文章被收录于专栏:Web 技术Web 技术
运行总次数:2
代码可运行

数据交互

主要从下面几类讲解:

  • 1、http协议
  • 2、form表单
  • 3、ajax–官方提供,单向,浪费流量,默认不能跨域(不能从a.com读取b.com下的东西),但有跨域的方法
  • 4、jsonp ——民间,支持跨域,不推荐,破坏了http自身的安全协议
  • 5、WebSocket——H5新特性,双工(双向)
http协议
  • 1、无状态
  • 2、连接过程:连接、接收、发送(三次握手)
  • 3、消息报文2部分:头部(header)<=32k、体部(body)<=2G

http缓存设置方式:

  • 1、随机数:一种“野路子”写法
  • 2、缓存原理 - 头部:Cache-control、 Date、Expires

http与https:

  • https在http之上加上安全特性
  • https需要证书:证明你自己身份,有相应的颁发机构,一般分两种:一种是第三方颁布的,一种是自己颁布的 Let’s Encrypt免费
  • 生成证书的时候,就会生成公钥

http版本

  • http1.0 面向短连接:请求之后连接就断开
  • http1.1 主流 长连接——keep alive
  • http2.0 还未大规模应用推广
Http2.0
  • 强制使用https
  • 性能高:面向流、头压缩、多路复用
  • 双向通信——服务器推送
  • 未来趋势
form
  • ajax\jsonp都是对Form的模拟
  • action : 提交到哪
  • method: GET/POST/PUT/DELETE/HEAD
  • GET:把数据放在url里面传输 ,数据量很小,会缓存(主要便于获取,下次获取时就更快),看得见
  • POST: 放在Body里 , 数据量大,不会缓存 ,看不见
  • DELETE:删除
  • PUT:发送
  • HEAD:让服务器只发送头回来就行(不需要内容),form发不出head请求;代码可以发head请求,服务器会只返回一个Response Headers;常用于测试服务器是否存在
  • enctype :
    • application/x-www-form-urlencoded 默认、适合发送小数据 形式:名字=值&名字=值…
    • multipart/form-data 上传文件 、分块、适合大数据(<=1G)
    • text/plain 纯文本,不常用
  • formData
  • RESTFUL https://www.imooc.com/learn/811
ajax原理

XMLHttpRequest对象,不兼容IE6

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1、创建对象
let xhr = new XMLHttpRequest();

//2、连接
xhr.open('GET','url',true); //true异步,false同步
//3、发送
xhr.send('body数据');
//4、接收
xhr.onreadystatechange = function(){
//onreadystatechange分多次执行
//readyState当前通信状态值:
//1、 0 初始状态:xhr对象刚刚创建完
//2、 1 连接:连接到服务器
//3、 2 发送请求:刚刚Send完
//4、 3 接收完成:头接收完了
//5、 4 接收完成:体接收完了
//status--http状态码,表明通信结果
//1xx 消息
//2xx,304 成功
//3xx  重定向 301 Moved Permanently(永久重定向,下回不会再请求这个服务器) 302-临时重定向(下回依然会请求这个服务器) 304-Not Modified(date 缓存未过期、缓存过期)
//4xx  请求错误,主要错误原因在客户端
//5xx  服务端错误
//6xx+ 自定义

if(xhr.readyState==4){
		if(xhr.status>=200&&xhr.status<300||xhr.status==304){
			//success
			console.log(xhr.response)
			//xhr.response
			//xhr.responseText 以文本方式返回数据
			//xhr.responseURL 
			//xhr.responseXML  以XML方式返回数据
			
			let arr = eval('('+xhr.responseText+')') //解析方式1,不安全
			let json=null;
			try{
				json = JSON.parse(xhr.respinseText) //解析成json
			}catch(e){
				json = eval('('+xhr.responseText+')') 
			}
			
			
		}else {
			//failed
		}
}
}

重定向: 例子:

  • PC端访问: 302->www.taobao.com
  • 手机端访问: 302->m.taobao.com

安全:

  • 前端没有大的安全性可言,后端才有;
  • xss – 跨站脚本攻击,别人把js代码放在你的代码上执行
    • DNS污染,如运营商
    • 自己造成

本节关键:

  • http文档:https://tools.ietf.org/html/rfc2616
  • http状态码
  • eval、json
  • ajax2.0概念
Ajax2.0
  • 兼容IE10+
  • FormData(容器): set()、get()、append()、delete()…等
  • 文件上传,依赖FormData;上传进度监控 xhr.upload.onload/onprogress;
  • CORS跨域(跨域资源共享)
  • Ajax长连接(已被WebSocket替代)
  • xhr.send(formData)\xhr.send(Blob)\xhr.send(Buffer) ,Blob\Buffer二进制数据
FormData
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//FormData 一种容器
//formData.set('name',value)
<input type="button" value="ajax请求" id="btn1">
    <script>
        window.onload = function() {
            var oBtn = document.getElementById('btn1');
            oBtn.onclick= function(){
                var formData = new FormData();
                formData.set('a',12);
                formData.set('b',5);
                var xhr = new XMLHttpRequest();
                xhr.open('post','1.php',false);
                xhr.send(formData);
                xhr.onreadystatechange=function() {
                    if(xhr.readyState==4)
                        if(xhr.status>200&&xhr.status<300||xhr.status==304){
                            alert(xhr.responseText);
                        }else {
                            alert('error')
                        }
                    }
                }
            }
        }
    </script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//FormData文件上传
//formData.set('name',<input type="file"/>);
//xhr.upload.onload 上传完成
//xhr.upload.onprogress 进度变化
	 <input type="file"  id="f1"/>
    <input type="button" value="ajax请求" id="btn1">
    <script>
        window.onload = function() {
            var oBtn = document.getElementById('btn1');
            var oF1 = document.getElementById('f1');

            oBtn.onclick= function(){
                var formData = new FormData();
                formData.set('f1',oF1);

                var xhr = new XMLHttpRequest();

                //进度条
                xhr.upload.onload = function(){
                    console.log('上传完成')
                }
                xhr.upload.onprogress = function(ev){
                    console.log(ev.loaded+'/'+ev.total);
                }

                xhr.open('post','1.php',false);
                xhr.send(formData);

                xhr.onreadystatechange=function() {
                    if(xhr.readyState==4){
                        
                        if(xhr.status>200&&xhr.status<300||xhr.status==304){
                            alert(xhr.responseText);
                        }else {
                            alert('error')
                        }
                    }
                }
            }
        }
    </script>
CORS 跨域
  • 跨域:域不同。域=协议+域名+端口
  • 浏览器+服务器共同配合

浏览器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="file"  id="f1"/>
    <input type="button" value="ajax请求" id="btn1">
    <script>
        window.onload = function() {
            var oBtn = document.getElementById('btn1');
            var oF1 = document.getElementById('f1');

            oBtn.onclick= function(){
                var xhr = new XMLHttpRequest();
                xhr.open('post','http://localhost:8080',true);
                xhr.send();
                xhr.onreadystatechange=function() {
                    if(xhr.readyState==4){
                        alert(xhr.status);
                    }
                }
            }
        }
    </script>

服务器 res.setHeader(‘Access-Control-Allow-Origin’,‘*’);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http');

let server = http.createServer(function(req,res){
    console.log(req.headers);
    let allowHosts = ['baidu.com','taobao.com','tmall.com']; //加判断,过滤
    if(allowHost.indexOf(req.headers['origin'])!=-1){
        res.setHeader('Access-Control-Allow-Origin','*');  //服务器推一个头Access-Control-Allow-Origin会去
    }
    res.write('123');
    res.end();
})

server.listen(8080);

req.headers

jsonp跨域原理(逐渐被废弃)
  • 例子(百度)

https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=qqvip&json=1&p=3&sid=1469_21089_27400_26350_22159&req=2&pbs=qq%E9%82%AE%E7%AE%B1&csor=5&pwd=qqvio&cb=jQuery110204607003182369671_1540901339951&_=1540901339957

关键:

  • https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=qqvi&cb=jQuery110204607003182369671_1540901339951&_=1540901339957
  • https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=qqvi&cb=show // wd=qqq 搜索词 , cb=show (cb:回调函数,show要回调的函数,如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show({q:"qqvi",p:false,s:["qqvip","qqvip免费","qqvip邮箱","qq录屏","qq表情怎么导入微信表情","qqvip卡通第二天就没了","qq录屏快捷键","qqvip8","qqvip有什么用"]});

等价于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//引用了一个外部脚本
<script src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=qqvi&cb=show"></script>
<script>
function show(json){
	alert(json.s);  //s:["qqvip","qqvip免费","qqvip邮箱","qq录屏","qq表情怎么导入微信表情","qqvip卡通第二天就没了","qq录屏快捷键","qqvip8","qqvip有什么用"]
}
</script>
原理
  • 创建一个script标签,给一个src 调用你的函数,如show()
jquery 中的jsonp功能

注意:jQuery中的jsonp不是Ajax

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(function(){
	$.ajax({
		url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
		data: {wd:qqvip},
		dataType: 'jsonp',  //设置dataType为jsonp
		jsonp: 'cb',  //告诉JQuery这个回调函数的名字叫cb,名字不固定,你也可以叫callback等等
		success(json){
			alert(json.s);
		},
		error(){
			alert('error');
		}
	})
});
示例
  • 客户端修改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$.ajax({
	url:'http://localhost:8080/',
	data: {a:77,b:89},
	jsonp: 'callback',
	dataType: 'jsonp',
	success(num){
		alert(num)
	},
	error(e){
		alert(e);
	}
})
  • 服务端修改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http')
const url = require('url')

let server = http.createServer(function(req,res){
	let {pathname,query} = url.parse(req.url,true);
	let {a,b,callback}=query;
	
	res.write('${callback}($(parseInt(a)+parseInt(b)))');
	res.end();
})
WebSocket:
  • 双工
  • HTML5的,IE9+
  • 用的非常广
  • socket.io库,WebSocket兼容库
  • 安装:npm install socket.io
  • 给前后台使用
  • 基于/依赖于http http://socket.io //后端在node中使用:server.js 创建服务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http');
const io = require('socket.io');

//1.创建一个http服务
let httpServer = http.createServer();
server.listen();

//2.然后创建一个webSocket 服务
let wsServer = io.listen(httpServer);//监听一个http服务

wsServer.on('connection',function(sock){//连接事件,有连接时,会有一个sock对象
	sock.on('a',function(num1,num2){//接收
	    console.log('接到了浏览器发送的数据:${num1} ,${num2}');
	})
}) 

//方法

  • sock.emit 发送
  • sock.on 接收

//前端部分-做连接io.connect

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="../socket.io/socket.io.js"></script> //固定引入,实际上引入的是client.js
<script>
let sock = io.connect('ws://localhost:80080'); //前端也需要有一个sock对象,这样前后端都有一个sock对象,可以进行通信,"ws:"标识webSocket协议,告诉浏览器这是一个webSocket通信
document.onclick = function(){
	sock.emit('a',12,5);//取一个名称为“a”,自定义
}
</script>
//反之,服务端也可以进行emit,前端进行on
  • socket.io

1、兼容 2、二进制数据

  • v8引擎 预编译:在编译之前,先转换为二进制代码
  • nodejs

1、性能高 2、跟前台配合方便 3、适合前端人员入门 4、适合中间层应用,不适合大型项目开发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fs.wirteHeader() => 写header ,status=200
res.write() => 写body
  • package.json

作用:

  • 不用把node_modules 拷贝到服务器 ,只需拷贝package.json 然后再服务端只需npm i,就会下载需要的包
  • npm i XXX -D安装xxx需要依赖的包 “devDependencies”
  • "scripts"中可以写脚本
  • 聊天室业务分析:

1、用户注册、登陆 2、发言-》其他人 3、离线消息(离线的时候把数据存起来,等对方连接了,再从数据库中取出来)

数据-》数据库 1、用户 2、消息

单聊与群聊的区别:

  • 单聊是多个字段(这个消息是给谁了),群聊是广播,没有这个字段,大家都可见

数据库: 类型

  • 关系型数据库——MySQL、Oracle,优点是支持复杂的功能;但缺点是相对其他类型,性能低
  • 文件型数据库——SQLite, 简单;支撑不了庞大应用,没法存储特别多数据
  • 文档型数据库——MongoDB,可以直接存储对象本身;不够严谨,性能偏低
  • 空间型数据库——存储坐标、位置等GIS空间数据

NoSQL: 性能高

  • Redis、memcached、bigtable、hypertable
  • hive

库——文件夹,管理用,本身不能存数据 表——文件,存数据

类型:

  • 数字 整数 tinyint(-128,127或0-255)、int(21亿或43亿) 浮点数 float 8位、double 308位
  • 字符串 小字符串 varchar(255bit) 大字符串 text(2G)

主键

  • 唯一
  • 性能高

多语言language.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http');

let server= http.createServer((req,res)=>{
	console.log()
	req.headers['accept-language'].split(':')[0].split(',')[0];
	switch(lang.toLowerCase()){
		case 'zh-cn':
			res.setHeader({location:'http://localhost/cn/'})
			res.writeHeader(302);
			break;
		default:
			res.setHeader({location:'http://localhost'})
			res.writeHeader(302);
			break;
	}
})
  • jQuery i18 插件 多语言
原生WebSocket
  • WebSocket对象 let ws = new WebSocket();
  • let sock = ws.connect(‘ws://localhost:8080’);
  • on 方法
  • message时间
后端websocket
参考
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cmake 简介2021-10-03
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
用户3519280
2023/07/08
4140
CMake简易指南
CMake 详细说明参考官方文档 https://cmake.org/cmake/help/latest/index.html,其中latest为最新版本版本,不同 CMake 版本,API 有差异,请根据当前项目设置的最低版本来参考,高版本 API 在低版本无法使用。3.20之后的文档会标记该 API 的生效版本
Huahua
2023/09/06
9550
CMake简易指南
Cmake的使用
有了Cmake以后,只需要编写一个CmakeLists文件就可以对应将一个C++工程不通操作系统
全栈程序员站长
2022/09/22
1.5K0
Cmake的使用
CMake使用总结
CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。
bear_fish
2018/09/19
1.8K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
2.9K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
cmake快速入门「建议收藏」
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。
全栈程序员站长
2022/09/13
1.2K0
cmake快速入门「建议收藏」
CMake 基础学习
使用 {}进行变量的引用。例如:message({Hello_VERSION}), Hello为工程名。CMake提供了很多有用的变量。以下仅列举常用的变量:
艳龙
2021/12/16
1.8K0
CMake学习笔记(二)——CMake语法
剑影啸清寒
2018/01/02
5.9K0
Cmake学习总结(三)
大家好,在上一篇文Cmake文章里面,我们同样在文章的最后面留了一个问题实现,就是把源文件放到src目录下,把头文件放到include目录下去,这样也比较符合别人和自己日后去配置工程(一看到这两个目就能知道啥意思了,清晰明了),同时在linux环境下生成的elf文件放到bin目录下;不过在文章发出去了几天,后面有网友又有提出了一些新的需求:
用户6280468
2022/03/21
5080
Cmake学习总结(三)
CMake 秘籍(五)
每个项目都必须处理依赖关系,而 CMake 使得在配置项目的系统上查找这些依赖关系变得相对容易。第三章,检测外部库和程序,展示了如何在系统上找到已安装的依赖项,并且到目前为止我们一直使用相同的模式。然而,如果依赖关系未得到满足,我们最多只能导致配置失败并告知用户失败的原因。但是,使用 CMake,我们可以组织项目,以便在系统上找不到依赖项时自动获取和构建它们。本章将介绍和分析ExternalProject.cmake和FetchContent.cmake标准模块以及它们在超级构建模式中的使用。前者允许我们在构建时间获取项目的依赖项,并且长期以来一直是 CMake 的一部分。后者模块是在 CMake 3.11 版本中添加的,允许我们在配置时间获取依赖项。通过超级构建模式,我们可以有效地利用 CMake 作为高级包管理器:在您的项目中,您将以相同的方式处理依赖项,无论它们是否已经在系统上可用,或者它们是否需要从头开始构建。接下来的五个示例将引导您了解该模式,并展示如何使用它来获取和构建几乎任何依赖项。
ApacheCN_飞龙
2024/05/16
9610
CMAKE使用手记
首先感谢那位叫“任麒麟”的网友整理的PDF,有心了。 我也忘了哪里下载的,不过确实挺全的。
看、未来
2021/10/09
5530
CMAKE入门实战
最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧,原作者github地址:https://github.com/wzpan/cmake-demo。
公众号guangcity
2019/09/20
1.5K0
CMAKE入门实战
Cmake学习总结(二)
大家好,上次给大家分享了第一篇 cmake 文章:cmake学习总结(一),今天继续给大家分享cmake。那么废话就不多说,开始内容分享。
用户6280468
2022/03/21
2810
cmake使用
CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装编译过程。
李小白是一只喵
2020/10/28
2K0
cmake使用
CMake学习笔记
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!
CtrlX
2023/02/06
2.1K0
CMake,大型项目采用的构建工具
本篇文章主要描述CMake的基本用法。在之前的文件中我对Makefile,Autotools这两个构建工具。相关文章如下:
Rice加饭
2022/05/10
1.2K0
跨平台编译工具-CMake的语法特性与常用变量
最近在学习 Linux 下的 C+ 开发的编译知识,总结出该系列笔记,这是第五篇,可以通过以下链接阅读之前的笔记:
极客开发者
2022/01/18
1.2K0
CMake 使用学习
CMake 工具能够自动生成 Makefile 文件,减轻手写 Makefile 文件的工作量,同时减少书写 Makefile 文件产生的错误。
hotarugali
2022/03/13
2.6K0
CMake简介及使用实例
CMake是一个跨平台的建构系统的工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的构建文档makefile或者project文件,描述系统建构的过程。还能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。CMake并不直接建构出最终的软件,而是产生标准的建构档(如 Unix的 Makefile或 Windows Visual C++的 projects/workspaces),然后再依一般的构建方式使用。
恋喵大鲤鱼
2018/08/03
2.7K0
使用Cmake生成跨平台项目编译解决方案
    项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护,需要一个能够跨平台的项目编译解决方案,经过调研之后,选择了使用cmake这个工具,本文主要讲述,使用cmake的生产项目的一些基础知识。
帘卷西风
2018/08/03
5.6K0
使用Cmake生成跨平台项目编译解决方案
相关推荐
cmake 简介2021-10-03
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验