浏览器的通信能力

news2024/11/10 15:47:17

用户代理

浏览器可以代替用户完成http请求,代替用户解析响应结果,所以我们称之为:用户代理 user agent
在网络层面,对于前端开发者,必须要知道浏览器拥有的两大核心能力

  • 自动发出请求的能力
  • 自动解析响应的能力

自动发出请求的能力

当一些事情发生的时候,浏览器会代替用户自动发出http请求,常见的包括:

  1. 用户在地址栏输入了一个url地址,并按下了回车
    浏览器会自动解析URL,并发出一个GET请求,同时抛弃当前页面
  2. 当用户点击了页面中的a元素
    当用户会拿到a元素的href地址,并发出一个GET请求,同时抛弃当前页面
  3. 当用户点击了提交按钮<button type="submit">...</button>
    浏览器会获取按钮所在的<form>元素,拿到它的action属性地址,同时拿到它的method属性值,然后把表单中的数据组织到请求体中,发出指定方法的请求,同时抛弃当前页面
这种方式的提交现在越来越少了
  1. 当解析了HTML时遇到了<link> <img> <script> <video> <audio>等元素
    浏览器会拿到对应的地址,发出GET请求

  2. 当浏览器点击了刷新
    浏览器会拿到当前页面的地址,以及当前页面的请求方法,重新发一次请求,同时抛弃当前页面

浏览器在发出请求时,会自动附带一些请求头

重点

一直以来,浏览器都有一个约定

当发送GET请求时,浏览器不会附带请求体
这个约定深刻的影响着后续的前后端各种应用,现在,几乎所有人都在潜意识中认同了这一点,无论是前端开发人员还是后端开发人员。
由于前后端程序的默认行为,逐渐造成了GET和POST的各种差异
1. 浏览器发送GET请求时,不会附带请求体
2. GET请求的传递信息量有限,适合传递少量数据;POST请求的传递信息量是没有限制的,适合传输大量数据。
3. GET请求传递的数据都附带在path参数中,能够通过分享地址完整的重现页面,但同时也暴露了数据,若有敏感数据传递,不应该使用GET请求,至少不应该放到path中
4. GET请求只能传递ASCII数据,遇到非ASCII数据需要进行编码;POST请求没有限制
5. POST不会保存到浏览器的历史记录中
6. 刷新页面是,如果当前的页面是通过POST请求得到的,则浏览器会提示用户是否重新提交。若是GET请求得到的页面则没有提示

自动解析响应的能力

浏览器不仅能发送请求,还能够针对服务器的各种响应结果做出不同的自动处理
常见的处理有:

  1. 识别响应码
    浏览器能够自动识别响应码,当出现一些特殊的响应码时浏览器会自动完成处理,比如301,302
  2. 根据响应结果做不同的处理
    浏览器能够自动分析响应头中的content-type,根据不同的值进行不同的处理,比如
    • text/plain:普通纯文本,浏览器通常会将响应体原封不动的显示到页面上
    • text/html: html文档,浏览器通常会将响应体作为页面进行渲染
    • text/JavaScriptapplication/javascript:js代码,浏览器通常会使用JS引擎将他解析执行
    • text/css: CSS代码。浏览器会将他视为样式
    • image/jpeg:浏览器会将他视作图片
    • application/octet-stream: 二进制数据,会触发浏览器下载功能
    • attachment:附件,会触发下载功能
      • 该值和其他值不同,应该放到Content-Disposition头中。

基本流程

访问https://oss.duyiedu.com/test/index.html
具体细节如下图所示:
在这里插入图片描述

接口开发

浏览器本身就具备网络通信的能力,但在早期,浏览器并没有把这个功能开放给JS
最早时微软在IE浏览器把这一能力想JS开放(所以别再吐槽ie啦),让JS可以在代码中发送请求,这项技术在2005年被正式命名为AJAX

IE使用了一套API来完成请求的发送,这套API主要依靠一个构造函数完成。该构造函数的名称为XMLHttpRequest简称为XHR,所以这套API又称为XHR API

由于XHR API有许多缺陷,在HTML5和ES6发布之后,产生了一套更完善的API来发送请求,这个API主要使用fetch函数,因此这套API又称之为Fetch API
无论是XHR还是Fetch,他们都是实现ajax的技术手段,知识API不同。

XHR API

var xhr = new XMLHttpRequest(); //创建发送请求的对象
xhr.onreadystatechange = function(){ //当请求状态发生改变时运行的函数
    // xhr.readyState: 一个数字,用于判断请求到了哪个阶段
    // 0: 刚刚创建好了请求对象,但还未配置请求(未调用open方法)
    // 1: open方法已被调用
    // 2: send方法已被调用
    // 3: 正在接收服务器的响应消息体
    // 4: 服务器响应的所有内容均已接收完毕
    
    // xhr.responseText: 获取服务器响应的消息体文本

    // xhr.getResponseHeader("Content-Type") 获取响应头Content-Type
}
xhr.open("请求方法", "url地址"); //配置请求
xhr.setRequestHeader("Content-Type", "application/json"); //设置请求头
xhr.send("请求体内容"); //构建请求体,发送到服务器,如果没有请求体,传递null

Fetch API

const resp = await fetch('url地址', { // 请求配置对象,可省略,省略则所有配置为默认值
  method: '请求方法', // 默认为GET
  headers: { // 请求头配置
    'Content-Type': 'application/json',
    'a': 'abc' 
  },
  body: '请求体内容' // 请求体
}); // fetch会返回一个Promise,该Promise会在接收完响应头后变为fulfilled

resp.headers; // 获取响应头对象
resp.status; // 获取响应状态码,例如200
resp.statusText; // 获取响应状态码文本,例如OK
resp.json(); // 用json的格式解析即将到来的响应体,返回Promise,解析完成后得到一个对象
resp.text(); // 用纯文本的格式解析即将到来的响应体,返回Promise,解析完成后得到一个字符串

实战 => token令牌

token令牌的定义: token定义
token令牌常出现在登录场景.
由于HTTP协议的特点,每次【请求-响应】都是独立的,这就会导致身份信息丢失的问题
在这里插入图片描述
这个问题可以使用token令牌解决
在这里插入图片描述
在使用AJAX时
可以按照这样一种通用模式进行处理

  1. 在初六响应结果时,只要服务器给我的响应头中包含了token,就将其保存在localStorage
  2. 在请求时,只要localStorage中有token,就将其代入到响应头发送到服务器。

代码封装

封装AJAX请求方法。提供一个request函数:

request(method, url, [options]):promise
  • method, String
  • url: String
  • options, 可选参数,object,请求配置,和fetch的配置相同
  • return,返回一个Promise,Promise完成后会得到一个对象

{
	headers: { ... } // 响应头,
  	data: { ... } // 响应体
}

request函数能够自动处理token
同时,它提供了request.get(url, [options])request.post(url, data, [options])的简约调用方式
封装的代码如下

// 当浏览器发送请求时,触发自调用函数
window.request = (() => {
  const TOKEN_KEY = '__token__';

  const request = async (method, url, options = {}) => {
    options.headers = options.headers || {};

    // 格式化options
    if (options.body && typeof options.body === 'object') {
      options.body = JSON.stringify(options.body);
      options.headers['content-type'] = 'application/json';
    }

    // 是否携带token
    const token = localStorage.getItem(TOKEN_KEY);
    if (token) {
      // 向请求头中加入内容
      options.headers.authorization = `Bearer ${token}`;
    }

    const resp = await fetch(url, {
      ...options,
      method: method.toUpperCase(),
    });
    const headers = Object.fromEntries(resp.headers.entries());

    // 检查头中的token
    if (headers.authorization) {
      localStorage.setItem(TOKEN_KEY, headers.authorization);
    }

    const body = await resp.json();
    return {
      headers,
      body,
    };
  };
  return request;
})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『51单片机』串口通信配置

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

技术分享 | 黑盒测试方法论—因果图

因果图法是一种利用图解法分析输入与输出的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 因果图法比较适合输入条件比较多的情况&#xff0c;可以测试所有的输入条件的排列组合。因果图的 “ 因 ” 就是输入条件&…

Flutter滚动悬浮效果

有以下几种效果 1、tabBar透明度随偏移0-1渐变过度 2、app上下滚动触发tabBar同步滚动 3、tabBar切换触发app上下同步滚动 1、计算每个区块的高度 用keyList保存声明的key&#xff0c;用heightList保存每个key对应的组件高度 // key列表 List<GlobalKey> keyList [Gl…

lower_bound与upper_bound的应用

<1>lower_bound (1). . 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的地址. 示例: (2) 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的下标. 示例: 例题: P2249 【深基13.例1】查找 P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生…

JavaSE(多态、abstract、接口)

1.多态 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同 的状态。 向上转型 向上转型&#xff1a;实际就是创建一个子类对象&#xff0c;将其当成父类对象来使用。 语法格式&…

(牛客)小杜跑酷

链接&#xff1a;https://ac.nowcoder.com/acm/contest/49244/F?&headNavacm 来源&#xff1a;牛客网 题目描述 小杜又在玩游戏了&#xff01;这回他玩的是跑酷游戏&#xff01; 已知该跑酷地图长为n&#xff0c;有3层&#xff0c;可以理解为一张3n的地图。令人新奇的是&…

Shiro学习看这一篇文章就够了

第一章 Shiro简介 第1节 shiro介绍 1官网地址: http://shiro.apache.org/Apache Shiro 是一个功能强大,易于使用的Java安全框架,他执行认证、授权、加密、会话管理等功能,使用Shiro易于理解的API,使你能够轻松的保护任何应用,如移动端应用,大型web应用以及企业级应用. Shiro可…

当前主流的后端语言,谁能夺得桂冠,果然是后生可畏!

主流后端语言 如今编程语言遍地开花&#xff0c;烟花迷乱&#xff0c;小编整理了最流行的几种编程语言如下&#xff1a; 这几种语言都是经久不衰&#xff0c;占领着后端编程界的半壁江山。TIOBE上的语言排名&#xff1a; C、Java、python&#xff0c;C&#xff0c; C#鏖战榜首…

元宇宙浪潮下,数智人拒绝“标品”

作者 | 曾响铃 文 | 响铃说 在各地文博会、生活节等大型文娱活动上&#xff0c;在博物馆等各类场馆的线上平台&#xff0c;在企业与用户交互的窗口&#xff0c;在政务平台滚动政策宣讲片中&#xff0c;尤其是&#xff0c;在各大卫视的跨年晚会上…… 2022年末、2023年年初&a…

MyBatis Generator ORM层面的代码自动生成器

在日常开发工作中&#xff0c;我们往往需要自己去构建各种数据表所对应的持久化对象&#xff08;POJO&#xff09;、用于操作数据库的接口&#xff08;DAO&#xff09;以及跟 DAO 所绑定的对应 XML。这都是一些重复性的操作&#xff0c;不需要多大技术含量。MyBatis Generator工…

优思学院|Minitab中的子组大小应该怎样填写?

关于SPC中的均值极差控制图&#xff08;X-bar-R Chart&#xff09;&#xff0c;都是质量管理和六西格玛最常用的工具之一&#xff0c;学生经常都会问及SPC和子组的问题。 所谓的子组&#xff08;Subgroup&#xff09;&#xff0c;是指在同一组条件&#xff08;包括人、机、物、…

人工智能辅助药物发现(2)苗头化合物筛选

目录AI辅助苗头化合物筛选概述AI辅助CPICPI数据库蛋白质和化合物的特征表示深度学习CPI预测经典Y型架构基于注意力的架构基于复合物的架构CPI性能评估苗头化合物筛选的发展前景挑战与趋势实际应用AI辅助苗头化合物筛选概述 新型小分子药物的开发通常从生物学家确定疾病靶标开始…

oracle数据库初始化问题及处理方法记录

环境&#xff1a; 服务器装机是redhat7.9&#xff0b;oracle19&#xff0c;用户是oracle&#xff0c;用户组dba 装机后进行初始化&#xff1a; 1.配置oracle用户环境变量&#xff1a;~/.bash_profile export ORACLE_SIDxxx export ORACLE_BASE/oracle/app/oracle export OR…

海康visionmaster-在WPF中使用Winform控件的方法

描述 环境&#xff1a;VM4.0.0 VS2013及以上 现象&#xff1a;在算子SDK开发过程中&#xff0c;用户如何使用封装好的Winform模板匹配等控件&#xff1f; 解答 首先添加对如下两个dll文件的引用&#xff1a;WindowsFormsIntegration.dll&#xff0c;System.Windows.Forms.…

深入MySQL字符编码与对照规则

前言 本篇和大家一起深入MySQL的字符集与对照规则&#xff0c;剖析下我们存储在MySQL中的字段是如何进行存储和校验比对的。 先看问题&#xff1a;unique key为什么失效了&#xff1f;拉齐共识&#xff1a;回顾下字符编码的基础知识&#xff0c;回炉下ASCII和Unicode。深入了解…

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点 二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度…

第三章 逻辑与推理

命题逻辑谓词逻辑知识图谱推理因果推理 3.1 命题逻辑 逻辑和推理是基于知识的操作。 命题逻辑是应用一套形式化规则对以符号表示的描述性陈述进行推理的系统。在命题逻辑中&#xff0c;一个或真或假的描述性陈述被称为原子命题&#xff0c;对原子命题的内部结构不做任何解析。…

UnityC#的lock用法简记

UnityC#的lock用法简记简述代码实例一、单线程二、多线程无lock三、多线程使用lock死锁注意拓展lock->InvokeMonitor参考链接简述 多线程环境中&#xff0c;不使用lock锁&#xff0c;会形成竞争条件&#xff0c;导致错误。 使用lock锁可以保证当有线程操作某个共享资源时&a…

【ONE·C || 操作符详解】

总言 C语言&#xff1a;各种操作符的使用介绍。 文章目录总言1、算术操作符2、移位操作符2.1、整体介绍2.2、左移操作符2.3、右移操作符&#xff08;逻辑右移、算术右移&#xff09;3、位操作符3.1、整体介绍3.2、演示实例3.2.1、按位与3.2.2、按位或3.2.3、按位异或3.2.4、按位…

离线文章画像计算--Tfidf计算

2.4.2 Tfidf计算 2.4.2.1 目的 计算出每篇文章的词语的TFIDF结果用于抽取画像 2.4.2.2TFIDF模型的训练步骤 读取N篇文章数据文章数据进行分词处理TFIDF模型训练保存&#xff0c;spark使用count与idf进行计算利用模型计算N篇文章数据的TFIDF值 2.4.2.3 实现 想要用TFIDF进行…