Fetch知识体系(二)

本文深入探讨Fetch知识体系,包括Request对象的创建与克隆、Response对象的构建与使用限制,以及Request、Response和Body的混入方法。强调了fetch存在的问题,如默认不携带cookie、无法检测请求进度,以及跨域情况下可能发送两次请求的原因分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fetch知识体系(一)icon-default.png?t=N7T8https://blog.youkuaiyun.com/askscl/article/details/136156631

四、Request对象

  1. 创建Request 对象

    1. const r = new Request(url, init)
  2. 克隆Request 对象

    1. 使用构造函数
      1. 再次传入init对象,会覆盖对象中同名的值
      2. 第一个请求体会被标记为‘已使用’
      3. 如果源对象与创建的新对象不同源,则 referrer 属性会被清除。
      4. 此外,如果源对象的 mode 为navigate ,则会被转换为 same-origin 。
    2. 使用clone()
      1. 任何值都不会被覆盖
      2. 不会将任何请求的请求体标记为“已使用”
    3. 注意事项:
      1. 如果请求对象的 bodyUsed 属性为 true (即请求体已被读取),
        1. 那么上述任何一种方式都不能用来创建这个对象的副本。在请求体被读取之后再克隆会导致抛出 TypeError 。
  3. 在 fetch() 中使用 Request 对象

    1. 不能拿请求体已经用过的Request 对象来发送请求
    2. 有请求体的Request对象只能在fetch中使用一次
    3. 想多次使用Request对象,在Request使用前,可以使用克隆的对象

五、Response对象

  1. 创建Response 对象

    1. 两个可选参数
      1. const r = new Response(body, init);
    2. 两个静态方法
      1. Response.redirect()
      2. Response.error()
  2. 读取响应状态信息

  3. 克隆 Response 对象(与Request规则类似)

    1. 使用clone()
    2. 注意事项
      1. 如果响应对象的 bodyUsed 属性为 true (即响应体已被读取),
        1. 则不能再创建这个对象的副本。在响应体被读取之后再克隆会导致抛出 TypeError 。
      2. 有响应体的 Response 对象只能读取一次。(不包含响应体的 Response 对象不受此限制。)
      3. 要多次读取包含响应体的同一个 Response 对象,必须在第一次读取前调用 clone()
      4. 通过创建带有原始响应体的 Response 实例,可以执行伪克隆操作。
        1. 关键是这样不会把第一个 Response 实例标记为已读,而是会在两个响应之间共享

六、Request 、 Response 及 Body 混入

  1. Body混入提供了5个方法

    1. Body.text()
    2. Body.json()
    3. Body.formData()
      1. append(键,值)
      2. get(键)
    4. Body.arrayBuffer()
      1. (buf) => new Int8Array(buf)
    5. Body.blob()
  2. 一次性流:

    1. body被使用一次就会上锁,表现为bodyUsed: false
    2. 构建在ReadableStream 之上
  3. 使用 ReadableStream 主体:

    1. 目的:实时读取和操作数据
    2. body.getReader()
      1. read()
      2. releaseLock()
    3. TextDecoder()
      1. decode(chunk, { stream: true})
    4. 双流技术
      1. 第一个流: body.getReader()
      2. 第二个流:new ReadableSteam()
      3. 作用:实时检查和操作流的内容

fetch存在问题

  1. fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。
  2. fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
  3. fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: ‘include’})
  4. fetch没有办法原生监测请求的进度,而XHR可以

七、问答:

  1. for  await of?

    1. 在for of里,有异步值
  2. 为什么要引入流的概念?

    1. 有效载荷的大小可能会导致网络延迟
    2. 流API在处理 有效载荷方面有优势
  3. 缓冲区是什么?

    1. 将流转存到缓冲区的内存里
    2. 将缓冲区转换成某种js对象类型
      1. 通过期约产生结果
      2. 期约会等待主体流报告完成及缓冲被解析
    3. 客户端必须等待响应的资源完全加载才能访问其内容
  4. 管道是什么?

    1. 用于导入另一个流
  5. fetch发送2次请求的原因?

    1. 条件:
      1. 跨域
      2. 使用消息格式: application/json
    2. 原因:
      1. 使用了带 预检(Preflighted)的跨域请求。该请求会在发送真实的请求之前发送一个类型为 OPTIONS的预检请求。
        1. 预检请求会 检测服务器是否有需要的跨域资源,有的话才会发送真实的请求。
          1. 例子
            1. 当我们在请求头部增加了authorization项,
            2. 那么在服务器响应头中需要放入Access-Control-Allow-Headers,并且其值中必须要包含authorization,
            3. 否则OPTIONS预检会失败,从而导致不会发送真实的请求。
      2. fetch第一次发送option类型的请求,这个请求主要是用来 询问服务器是否允许修改header头等一些操作
        1. 如果允许会返回204(服务器成功处理了请求,但没有返回任何内容),然后再发送真正的post请求拿回数据。
### ICT 行业知识体系结构概览 #### 一、基础理论与技术 ICT(Information and Communication Technology)涵盖了信息技术和通信技术两大领域。其核心在于通过电子手段处理信息并实现高效传输。 - **计算机科学原理**:包括数据结构、算法设计以及操作系统等基础知识,这些构成了软件开发的基础[^1]。 - **网络协议栈**:理解OSI七层模型或TCP/IP四/五层架构对于构建稳定可靠的互联网应用至关重要。每一层都有特定的功能和服务定义,确保不同设备间能够相互通信[^4]。 #### 、硬件设施 物理层面的支持是整个ICT系统的基石: - **服务器集群管理**:大规模数据中心内部署了大量的计算节点来支撑云服务平台运行,涉及虚拟化技术和容器编排工具的应用。 - **边缘计算部署**:随着物联网(IoT) 设备数量激增,在靠近数据源的地方进行初步的数据分析变得越来越重要,从而减少延迟并优化带宽利用率[^3]。 #### 三、平台服务 基于上述基础设施之上搭建的各种应用程序接口(APIs),使得开发者可以更便捷地创建功能丰富的解决方案。 - **云计算框架**:提供了按需分配资源的能力,支持弹性伸缩特性,降低了企业IT成本的同时提高了灵活性和响应速度。 - **大数据处理引擎**:面对海量非结构化数据流时,采用分布式文件系统(HDFS) 和实时流处理器(Spark Streaming, Flink) 来挖掘有价值的信息成为可能[^2]。 #### 四、应用场景拓展 最终目的是为了满足各行各业的实际需求而不断演进的技术组合。 - **智能交通系统(V2X)**:借助车载单元(OBU)/远程信息控制盒(T-Box), 实现车路协同感知环境变化预警事故风险等功能,同时也促进了线上到线下(O2O) 商务模式的发展。 - **智慧城市建设项目**:综合运用传感器网络采集城市运营状态参数,结合地理信息系统(GIS) 展示可视化界面辅助决策者制定政策规划。 ```python # Python 示例代码用于说明如何连接数据库查询车辆行驶记录 import sqlite3 def fetch_vehicle_data(vehicle_id): conn = sqlite3.connect('vehicle.db') cursor = conn.cursor() query = f"SELECT * FROM vehicle_records WHERE id='{vehicle_id}'" result = cursor.execute(query).fetchall() conn.close() return result ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顶尖前端大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值