Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web 数据传输的方式

Web 数据传输的方式

作者头像
玖柒的小窝
修改于 2021-12-24 03:38:57
修改于 2021-12-24 03:38:57
1.5K06
代码可运行
举报
文章被收录于专栏:各类技术文章~各类技术文章~
运行总次数:6
代码可运行

前言

Web 发展至今,通常情况的数据传输方式是通过 Ajax 进行数据通信。除了 Ajax 传输JSON之外,还有很多其他的通信方式。本文将以 请求数据、发送数据和数据格式的角度,来介绍 Web 数据传输的方式和类型。

请求数据 (Request Data)

通常是 Web 向服务器请求资源时的动作。

XMLHttpRequest

XMLHttpRequest 是目前最常用的技术,允许异步发送请求。XMLHttpRequest 是 axios 的基石。可以这样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const url = 'https://blog.gdccwxx.com'
const req = new XMLHttpRequest();

req.onreadystatechange = () => {
    if (req.readyState === 4) { // request done
        const responseHeader = req.getAllResponseHeaders();
        const data = req.responseText;
        console.log(data);
    }
    if (req.readyState === 3) { // requesting
        const responseHeader = req.getAllResponseHeaders();
        const data = req.responseText;
        console.log('requesting', data);
    }
};

req.open('GET', url, true);
req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
req.send(null);
复制代码

通过 new XMLHttpRequest() 来创建请求实例; 使用 open()send() 方法发送请求; readyState 代表请求状态,3 是请求中,4是请求完成; onreadystatechange() 来监听请求状态的变化,通过监听 readyState 来判断请求当前的状态。

对只会获取数据,不会改变服务状态的行为,尽量使用 GET 方法。因为 GET 请求方法会被缓存起来。对同一请求会有性能的提升。只有当 URL 请求长度接近或超过 2048 个字节时才需要换成 POST。部分浏览器会 URL 超长截断。

同时他的支持也非常友好,几乎各大浏览器厂商支持率都非常高。是异步获取数据的不二之选。

Fetch

相比事件监听的 XMLHttpRequest, fetchAPI 更加优美。它的 Promise 化的方式不仅语法简洁,同时支持 Service WorkersCache API 等场景。

感受下使用的简洁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const data = await fetch('https://blog.gdccwxx.com', {
    method: 'GET',
    'Content-Type': 'text/plain',
});
console.log('data', data);
复制代码

fetch 的第一个参数代表请求的url; 第二个参数代表配置项,可配置请求方法、响应内容类型等。

他的支持虽然没有 XMLHttpRequest 好,对于基础场景还是绰绰有余。demo 页面的完美解决方案。

动态脚本注入

相比上面两种的常规方式,动态脚本注入算是一种异类。这种方式最大的好处是:克服了XHR 最大的限制: 能跨域请求数据。可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.html
const scriptElement = document.createElement('script');
scriptElement.src = 'http://127.0.0.1:5500/lib.js';
document.getElementsByTagName('head')[0].appendChild(scriptElement)

function jsonCallback(jsonString) {
  console.log('requested!', jsonString);
}


// 127.0.0.1:5500/lib.js
jsonCallback({ status: 'success' });
复制代码

例如:

此用例是的特点:

  • html 文件是本地静态文件
  • lib 文件是跨域文件

不过,这项技术虽然能够解决跨域问题,但动态注入的代码能完全控制整个页面。包括修改网页内容,重定向到其他网站等。因此引入外部来源的代码时要多加小心。

Multipart XHR

Multipart XHR 允许客户端用一个 HTTP 请求,就可以从服务器传输多个资源。它通过在服务端将资源打包成双方约定的字符串分割的长字符串。然后用JS 处理这个字符串,并根据 mime-type 类型和传入其他的头信息,并解析出来。

他和 HTTP2 的静态推送有些类似,不同的是 HTTP2 静态推送的按照资源级别主动推送,无需 js 解析;而 Multipart XHR 将文件打包成一个,在浏览器端通过 JS 方式解析。

这种方式虽然可以完全被 HTTP2 替代,但为了减少资源请求而减少 http 握手的思维方式值得借鉴。

发送数据(Sending Data)

有些时候并不关心接收数据,只需要将数据发送到服务器即可。例如发送上报,行为记录,捕获错误等。当数据只需要发送到服务器时,有两种广泛使用的技术:XHR 和 信标。

XMLHttpRequest、Fetch 方式

这种方式无须多言,在少量数据时使用 GET方式,因为GET请求往往只发送一个数据包,而 POST 则是2个,包括头信息正文。大量数据使用 POST ,超长 URL 会被截断。

信标方式(Beacons)

这种技术和动态脚本注入非常类似,使用 JS 创建 Image 对象,把 src 属性设置为上报的 URL ,这个其中包含了要通过 GET 传回的键值对数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const url = 'https://blog.gdccwxx.com';
const params = [ 'result=true']

(new Image()).src = `${url}?${params.join('&')}`;
复制代码

这样服务器会接受到数据并保存下来,无需反馈任何信息。这是给服务器传消息的最有效的方式,因为性能消耗很小,而且服务端出错完全不会影响客户端。

不过因为这种方式很简单,意味着做的事情也是有限的。

  • 无法发送 POST 数据, URL 有长度限制
  • 可以接受服务器的数据,但是很局限。例如通过监听 image 的宽度等

如果无需大量数据上传到服务器,也无需关心响应正文,信标方式时一种非常完美的解决方案。如果需要,那么 XMLHttpRequestfetch 是更好的选择。

数据格式 (Data Formats)

考虑数据传输技术时,必须考虑数据的传输速度。而相同数据在不同数据格式下的大小并不一样,因此如何选择数据格式成为了传输速度的关键。

XML

Ajax 流行之初,选择了 XML 作为通用数据格式,他有很多优点:优秀的通用性,格式严格容易验证,因此当时几乎所有服务器都支持 XML 格式。

下面是 XML 例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<? xml version="1.0" encoding="utf-8">
<user id="gdccwxx">
    <username>gdccwxx</username>
    <email>gdccwxx@gmail.com</email>
    <blog>blog.gdccwxx.com</blog>
</user>
复制代码

相比其它格式, XML 十分冗长吗,而且语法有些模糊。在解析过程中,必须先知道 XML 的布局,才能弄清含义。而且也不容易解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function parserXML(xml) {
    const user = xml.getElementsByTagName('user')[0];
    const id = user.getAttribute('id');
    const username = user.getElementsByTagName('username')[0].nodeValue ?? '';
    // ...
}
复制代码

JSON

JSON 是一种使用JavaScript 对象的轻量级且易于解析的数据格式。表示同样的数据格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "user": {
    "id": "gdccwxx",
    "username": "gdccwxx",
    "email": "gdccwxx@gmail.com",
    "blog": "blog.gdccwxx.com",
  }
}
复制代码

它转化为JS Object 非常简单, 原生JS 方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function parseJSON(text) {
  return eval(`(${text})`);
}

// or

JSON.parse(text);
复制代码

JSON 方式是一种非常通用、非常简洁的一种格式。

HTML

HTML 不仅可以展示成页面,也是一种数据传输的格式。虽然他是一种较为臃肿的数据格式,甚至比 XML 还要复杂的多。不过在页面服务端渲染上,他是不错的选择。下面看个数据传输的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ul>
  <li class="user" id="gdccwxx">
    <span>gdccwxx</span>
    <a href="mailto:gdccwxx@gmail.com">gdccwxx@gmail.com</a>
    <a href="https://blog.gdccwxx.com">blog.gdccwxx.com</a>
  </li>
</ul>
复制代码

自定义格式

理想的数据结构应该是只包含必要的结构,可以简单的包裹起来。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1:gdccwxx;gdccwxx@gmail.com;blog.gdccwxx.com
复制代码

这种数据结构相当简洁,能够非常快速的下载,相比任何通用结构都简洁很多。

解析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function parseCustomType(str) {
  const [, content] = str.split(':');
  const [user, mail, blog] = content.split(';');
  return { user, mail, blog };
}
复制代码

但这种方式的通用性并不高,对一些要求极致速度的业务是不错的方案。

从形态上很容易判断出,他们的传输速度排序如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
自定义格式 > JSON > XML > HTML
复制代码

通用性如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON > XML > HTML > 自定义格式
复制代码

JSON 类型在通用和传输速度上都有着不错的表现,也在几乎可以说对比中完获胜。

结束语

相比10年前的web时代的诸多不确定性,我们这个时代简直是站在巨人的肩膀上看世界。不过也是因为 Web 请求方式上逐渐面临大一统,现代web也缺少了许多灵动性。

想起前段时间和客户端专家大佬聊天,他表示现在 web 越来越像客户端,而客户端越来越偏web。不禁让我深思:10年后的web会是怎样呢?是 web2.0 时代的灵动轻快?还是 facebook 客户端式的齐全和完整?时间会证明吧~

本文系转载,前往查看

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

本文系转载,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
热点|微信小程序的AR功能
“微宝阁的陆总认为小程序作为日异月新的商业力量,基于“月活跃”于大量用户的微信生态环境中,流量大,入口多,功能强大而便捷。”
微宝阁
2019/07/23
4.1K0
不用AI的彩妆店不是好专柜?
人工智能赋能美妆早已不是新鲜事,经过前几年的“试水”,AI+彩妆似乎已在美妆行业形成一种风潮,逐渐改变了化妆品营销手段与产品研发的走向。而目前市场发展最成熟、应用最为广泛的,便是以人工智能深度学习算法与3D AR增强现实等技术为基础的AR虚拟试妆。
用户2908108
2021/03/03
9920
不用AI的彩妆店不是好专柜?
小程序成微信社交打造智慧零售生态圈的关键环节
随着零售业运营成本不断攀升,门店引流能力有限,零售商对于精准获客以及顾客有效留存和转化的需求极为强烈,线上线下的一体化融合已是大势所趋。
场景录小程序
2018/07/04
1.2K0
小程序成微信社交打造智慧零售生态圈的关键环节
2020年VR/AR购物人数将破亿,宜家、Target……共同创建VR/AR购物新标准
近日小编了解到,有超140家零售商正在与科技公司合作,计划在购物上应用VR/AR体验。这是一个新的组织,旨在为VR/AR购物的3D图像创建一套通用的标准。Target、宜家、Lowe's、Houzz、Wayfair、Williams-Sonoma等知名零售商,抛开了他们之间的竞争关系,共同为这个标准努力。
VRPinea
2019/05/17
9080
2020年VR/AR购物人数将破亿,宜家、Target……共同创建VR/AR购物新标准
欧莱雅们纷纷举起AI美妆大旗,她经济也要变天了
爱美之心人皆有之,AI美妆花样多、美妆热品脱销、美妆直播火爆,李佳琪一声“OMG!买它”,见证了“她经济”的能量。
刘旷
2020/04/29
8060
欧莱雅们纷纷举起AI美妆大旗,她经济也要变天了
2022爱分析・消费品零售数字化厂商全景报告 | 爱分析报告
面对疫情冲击、行业承压、消费者需求多变等挑战,消费品零售行业企业加速向数字化转型升级,积极谋求破局发展之路。一方面,受疫情因素及经济疲软影响,消费品零售行业整体增速放缓,利润下滑,同时叠加行业市场竞争加剧,企业迫切需要通过数字化手段实现差异化、精细化运营,提升自身竞争力;另一方面,消费者的消费理念和消费行为不断发生改变,更加注重交互体验和个性化需求,以及便利性、及时性的需求,在触点方面也更加碎片和多元,相应驱动品牌零售企业对营销及运营模式、订单及库存管理、渠道管理、门店运营等多方面进行变革。
爱分析ifenxi
2022/12/27
7320
TensorFlow助力微信小程序,来自谷歌开发者大会上的商用案例
前段时间一直在研究微信小程序中的 TensorFlow.js 开发,并开发了若干示例小程序,详情请查看之前的文章:
云水木石
2019/09/17
1.2K0
TensorFlow助力微信小程序,来自谷歌开发者大会上的商用案例
央视又双叒叕点赞京东黑科技:人工智能更懂你!
动动嘴就能买东西控制家电、“看到”心仪的家具在自己屋里的实际摆放情况、对着镜子就可以尝试究竟哪种口红最适合自己、哪些手袋和鞋更配自己刚刚挑选的衣服……这些未来感十足的消费体验背后,是京东叮咚Play、
京东技术
2018/06/20
9570
顾客新宠柜姐福音,AR试妆引领购物新体验
近日,雅诗兰黛和加拿大AR技术公司ModiFace一起合作,在其官网和手机App上新增了试妆功能,该功能支持消费者通过屏幕完成各种妆面的试色。事实上,这已经不是雅诗兰黛第一次尝试使用AR技术。 今年4月,雅诗兰黛曾和另一家AR技术公司YouCam合作,在英国塞尔福里奇百货商场雅诗兰黛专柜、伦敦卡纳比街雅诗兰黛的店铺中同时推出了试妆体验,顾客可以在柜台通过AR技术,尝试30种不同的口红颜色。 其实不止雅诗兰黛,近年来,美妆业的巨头们纷纷与科技公司进行合作,借助AR为自己的产品做宣传,提升顾客
VRPinea
2018/05/16
1.7K0
AR试妆领域动作频频,无奈市场体验大同小异
种草某款彩妆,但嫌专柜试色太远?商场试口红,试完几支后,颜色重叠、重复卸妆太麻烦?担心试用品的卫生问题?其实就是希望在家便能试完妆,看中就买买买?也许AR试妆这种较为时尚的方法可以在某种程度上助你一臂之力。
VRPinea
2018/07/26
1.6K0
AR试妆领域动作频频,无奈市场体验大同小异
微信小程序运营模式有哪些?如何提升分享率和转化率?
自小程序2017年1月9号正式上线以来,不论是中小商家,还是各大品牌巨头,都在抢占小程序这波风口,打造属于自己的小程序。截至目前,全国正式上线小程序超过150万个,小程序日均活跃用户稳居在1.7亿左右,而整个微信流量在10.4亿左右。这才仅仅是小程序发展一年半左右的时间,可以肯定的说,从现在的情况来看,小程序潜力无限。总而言之,像工行,建行,万达,摩拜,古驰,拼多多,麦当劳,星巴克,南航,网易等国内各行各业大巨头都相继推出了小程序,再加上支付宝小程序将要正式上线,包括小米华为,OPPO,金立,联想等国产九大手机厂商联合推出快应用,都是为了抢占这个市场。「速成应用」打造A+级微信小程序的平台,可视化的操作 拖拽组件快速搭建小程序,如果你对“小程序”有兴趣的话,可以注册体验。
速成应用小程序开发平台
2018/08/19
8411
美业+智能体,解锁行业转化新密码(2/6)
近年来,美业市场呈现出蓬勃发展的态势,成为消费领域的重要增长点。数据显示,中国美业市场规模在过去几年保持着两位数的增长,预计在未来几年还将持续扩张,有望在不久的将来突破万亿级别 。这一增长得益于人们生活水平的提高、消费观念的转变以及对美的追求日益强烈。美容、美发、医美、美甲等细分领域百花齐放,满足着不同消费者的多样化需求。
正在走向自律
2025/06/02
2260
美业+智能体,解锁行业转化新密码(2/6)
小程序成微信社交打造智慧零售生态圈的关键环节
随着零售业运营成本不断攀升,门店引流能力有限,零售商对于精准获客以及顾客有效留存和转化的需求极为强烈,线上线下的一体化融合已是大势所趋。
场景录小程序
2018/06/27
5500
小程序成微信社交打造智慧零售生态圈的关键环节
7.8 VR扫描:美陆军将用IVAS AR开启实战测试;欧莱雅AR美妆已登录微信小程序
日前,微软向美国陆军交付了50台IVAS AR设备,该设备系统已于今年4月份,在弗吉尼亚州皮克特堡进行首次测试。其测试将持续到11月,以帮助IVAS将六中不同的设备和资源组合成一个连贯的系统。该设备将用于提高军队的杀伤力,强化他们在敌人袭击之前识别、决策和交火的能力。
VRPinea
2019/07/11
1.7K0
7.8 VR扫描:美陆军将用IVAS AR开启实战测试;欧莱雅AR美妆已登录微信小程序
淘宝的绝地求生:推出「小程序」到底是在反击微信,还是要打击京东
此前,阿里巴巴生态链从业人士向媒体透露,手淘 App 将在今年三月份推出小程序,并表示,已有合作伙伴从阿里巴巴内部高层会议得知,推进手淘小程序一事势在必行。「手淘小程序目的在于打通会员体系。而且,随着直播和微淘等场景的碎片化,手淘也需要有一个即用即走的场景。」
知晓君
2018/07/26
5040
干货|微信+小程序直播+短视频,帮你实现微信商业化关键一步!
2020年,直播电商无疑是最热的风口,前有罗永浩高调宣布进军直播电商,后有斗鱼重启电商直播,让整个直播电商赛道变的异常热闹。与此同时,一股来自小程序的直播力量强势崛起。自今年2月微信小程序直播启动公测以来,已经吸引了众多的品牌加入小程序直播阵营。接力微信,智慧商业服务提供商也在不动声色地加码直播电商业务,不仅推出小程序直播平台,还通过产业基金投资了直播电商服务机构。直播电商风口之下,商家们能否乘势而上,在竞争激烈的直播电商市场抢占一席之地?
云店加小程序分享
2020/04/16
1.4K0
TensorFlow.js:零基础在小程序上实现机器学习
微信日前官宣小程序支持AR功能。欧莱雅集团旗下阿玛尼美妆的官方微信小程序——“阿玛尼美妆官方精品商城”成为首个支持动态AR试妆的小程序,标志着全新的线上零售体验。
新智元
2019/08/09
2.6K0
增强现实让广告“活”起来——AR 赋能营销的新玩法
在这个信息爆炸的时代,消费者的注意力成为最稀缺的资源。传统广告早已难以满足用户的需求,而 增强现实(AR) 正在成为营销领域的一股革新力量,让广告从“平面”变成“立体”,从“被动接收”变成“互动体验”。今天,我们就来聊聊 AR 在广告营销中的创意玩法,以及如何利用技术实现这些想法。
Echo_Wish
2025/05/21
1060
增强现实让广告“活”起来——AR 赋能营销的新玩法
用AR提升电商体验,京东推出AR试妆镜、AR试衣镜和AR智能眼镜
化妆品柜台那么多颜色的口红,每一支都想试,可试了擦又擦了试,是不是嘴唇都要磨破了?衣服总要穿到身上才知道最终效果,但服装店的试衣间貌似永远在排队……这些消费者购物时的痛点,如今都可以用AR(增强现实)技术来解决。
量子位
2018/07/24
4.9K1
用AR提升电商体验,京东推出AR试妆镜、AR试衣镜和AR智能眼镜
Facebook连推AR应用,免费的背后是何意图?
长久以来,AR作为目前最火的技术之一,越来越受到各大厂商的青睐。其中就包括着Facebook。近几个月,Facebook在AR上连连下手,看来其对AR也是很认真了。
VRPinea
2018/09/28
5870
推荐阅读
相关推荐
热点|微信小程序的AR功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验