Fetch API

什么是Fetch API

Fetch API 是一种现代的 JavaScript API,用于进行网络请求和处理响应数据。它提供了一种更简单和更灵活的方式来执行网络请求,取代了传统的 XMLHttpRequest(XHR)。

Fetch API 具有以下特点:

Promise 风格的 API: Fetch API 使用 Promise 对象进行异步操作的处理。这使得处理异步操作变得更加直观和易于管理。

更清晰的语法: Fetch API 的语法更加清晰和简洁,可以通过链式调用来定义请求的各个参数。

支持请求和响应对象: Fetch API 允许您创建请求对象并设置请求头、请求方法、请求体等参数。同时,它也提供了处理响应的功能,可以获取响应头、响应状态等信息。

内置 JSON 解析: 在 Fetch API 中,处理 JSON 数据更加方便。默认情况下,响应数据会被自动解析为 JSON 对象。

跨域请求支持: 与 XMLHttpRequest 一样,Fetch API 也可以用于进行跨域请求。但是要注意,默认情况下,浏览器不会发送跨域请求的身份验证凭据(如 Cookie)。

fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。

浏览器原生提供这个对象。本文详细介绍它的用法。

一、基本用法

fetch()的功能与 XMLHttpRequest 基本相同,但有三个主要的差异。

  • (1)fetch()使用 Promise,不使用回调函数,因此大大简化了写法,写起来更简洁。

  • (2)fetch()采用模块化设计,API 分散在多个对象上(Response 对象、Request 对象、Headers 对象),更合理一些;相比之下,XMLHttpRequest 的 API 设计并不是很好,输入、输出、状态都在同一个接口管理,容易写出非常混乱的代码。

  • (3)fetch()通过数据流(Stream 对象)处理数据,可以分块读取,有利于提高网站性能表现,减少内存占用,对于请求大文件或者网速慢的场景相当有用。XMLHTTPRequest 对象不支持数据流,所有的数据必须放在缓存里,不支持分块读取,必须等待全部拿到后,再一次性吐出来。

在用法上,fetch()接受一个 URL 字符串作为参数,默认向该网址发出 GET 请求,返回一个 Promise 对象。它的基本用法如下。

fetch(url)
  .then(...)
  .catch(...)

下面是一个例子,从服务器获取 JSON 数据。

fetch('https://api.github.com/users/ruanyf')
  .then(response => response.json())
  .then(json => console.log(json))
  .catch(err => console.log('Request Failed', err)); 

上面示例中,fetch()接收到的response是一个 Stream 对象,response.json()是一个异步操作,取出所有内容,并将其转为 JSON 对象。

Promise 可以使用 await 语法改写,使得语义更清晰。

async function getJSON() {
  let url = 'https://api.github.com/users/ruanyf';
  try {
    let response = await fetch(url);
    return await response.json();
  } catch (error) {
    console.log('Request Failed', error);
  }
}

上面示例中,await语句必须放在try...catch里面,这样才能捕捉异步操作中可能发生的错误。

后文都采用await的写法,不使用.then()的写法。

二、Response 对象:处理 HTTP 回应

2.1 Response 对象的同步属性

fetch()请求成功以后,得到的是一个 Response 对象。它对应服务器的 HTTP 回应。

const response = await fetch(url);

前面说过,Response 包含的数据通过 Stream 接口异步读取,但是它还包含一些同步属性,对应 HTTP 回应的标头信息(Headers),可以立即读取。

async function fetchText() {
  let response = await fetch('/readme.txt');
  console.log(response.status); 
  console.log(response.statusText);
}

上面示例中,response.status和response.statusText就是 Response 的同步属性,可以立即读取。

标头信息属性有下面这些。

Response.ok

Response.ok属性返回一个布尔值,表示请求是否成功,true对应 HTTP 请求的状态码 200 到 299,false对应其他的状态码。

Response.status

Response.status属性返回一个数字,表示 HTTP 回应的状态码(例如200,表示成功请求)。

Response.statusText

Response.statusText属性返回一个字符串,表示 HTTP 回应的状态信息(例如请求成功以后,服务器返回"OK")。

Response.url

Response.url属性返回请求的 URL。如果 URL 存在跳转,该属性返回的是最终 URL。

Response.type

Response.type属性返回请求的类型。可能的值如下:

basic:普通请求,即同源请求。
cors:跨域请求。
error:网络错误,主要用于 Service Worker。
opaque:如果fetch()请求的type属性设为no-cors,就会返回这个值,详见请求部分。表示发出的是简单的跨域请求,类似<form>表单的那种跨域请求。
opaqueredirect:如果fetch()请求的redirect属性设为
Fetch API 是浏览器专为 JavaScript 发起异步请求设计的,是现代 JavaScript 开发中处理网络请求的常用方法,它是浏览器原生支持的 Web API 之一,不需要导包即可使用[^2]。 ### 功能特点 - **基于 Promise**:Fetch 返回的是一个 Promise 对象,使异步处理更加直观和方便,开发者可以使用 `.then()` 和 `.catch()` 方法来处理请求的成功和失败,也可以使用 `async/await` 语法,让异步代码看起来更像同步代码[^2]。 - **接口简洁**:相比 XMLHttpRequest,Fetch API 提供了简洁的接口,使用起来更加直观和易于理解,降低了开发者的使用门槛[^2]。 - **错误处理更好**:Fetch API 提供了更好的错误处理机制,可以更容易地捕获和处理网络请求中的错误。不过需要注意,Fetch 请求即使返回 404 或 500 状态码,Promise 也不会被标记为 rejected,只有在网络故障或请求被阻止时才会 rejected,因此需要手动检查响应的状态码来处理请求失败的情况[^2]。 ### 应用场景 Fetch API 本身并不构建生态项目,但广泛应用于前端框架和库中,例如 React、Vue 和 Angular,这些框架的 AJAX 请求常通过 Fetch API 或基于它的封装实现。一些流行的工具和库可能会提供 Fetch 的进一步封装,以增加诸如超时、重试逻辑等功能。随着 Fetch API 的成熟,许多开发者转向直接使用 Fetch 或其轻量级封装版,如 fetch-with-generate-id、isomorphic-fetch 等,以保持代码的原生性和兼容性[^1]。 ### 使用方法 Fetch API 的基本使用方法是调用 `fetch()` 函数,该函数接受一个必需的参数 `input`,表示请求的资源的 URL,还可以接受一个可选的参数 `init`,用于配置请求的选项,如请求方法、请求头、请求体等。以下是一些常见的使用示例: #### 获取文本数据 ```javascript fetch('https://example.com/data.txt') .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.text(); }) .then(data => console.log(data)) .catch(error => console.error('Fetch error:', error)); ``` #### 获取 JSON 数据 ```javascript fetch('https://example.com/data.json') .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(data => console.log(data)) .catch(error => console.error('Fetch error:', error)); ``` #### 发送 POST 请求 ```javascript const data = { key: 'value' }; fetch('https://example.com/api', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(data => console.log(data)) .catch(error => console.error('Fetch error:', error)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值