《十四》HTML5 网络请求 Fetch

Fetch API 是近年来被提及将要取代 XHR 的技术新标准。Fetch API 基于 Promise,用于浏览器发起网络请求,它提供了一种更简洁的方式来进行网络通信。

Fetch API 只适用于浏览器,不适用于 Node.js。

基本用法:

调用 fetch() 函数发起网络请求。该函数接收两个参数,第一个参数是一个 URL,第二个参数是一个配置对象(可以在其中配置 methods、headers 等)。该函数返回一个Promise 对象。

fetch('https://baike.baidu.com/cms/home/hotLemmas.json')
	// res 响应对象包含了服务器返回的所有信息,可以使用响应对象的 ok 属性来判断请求是否成功以及使用 json()、text()、blob() 等方法来解析响应体
  .then(res=> {
    	// res.ok 如果为 true,就表示可以读取数据了,不用再去判断 HTTP 状态码了
		if (res.ok) {
			// res.body 是一个可读流,无法直接读取到,可以通过 res.json() 或者 res.text() 来获取 JSON 格式或者普通文本格式的数据,返回的都是一个 Promise 对象。res.body 只能读取一次,读取过一次之后 res.bodyUsed 就会变为 true,无法再读取到
			return res.json()
		}
  })
  .then(data => {
  	// 真正要获取的数据
    console.log(data)
  })
  .catch(error => {
    console.error('Error:', error)
  })

取消请求:

AbortController 是 JavaScript 最新版本中的特性,它是在 fetch 被实现之后出现的。 所有现代浏览器都支持它。

AbortController 包含一个 abort 方法,还包含一个可以传递给 fetch 的 signal 属性。 当调用 AbortController.abort() 时,fetch 请求就会被取消。

// 获取AbortController实例
const controller = new AbortController();
// 获取 signal属性
const signal = controller.signal;
  
fetch('https://baike.baidu.com/cms/home/hotLemmas.json', {
	// 将 signal作为fetch的参数之一
	signal,
})

// 取消请求
controller.abort()
<think>我们正在讨论如何将网络请求转换为使用FetchAPI的格式。根据用户的问题,他想要知道如何将任意网络请求(可能是通过其他工具如Postman看到的)转换为FetchAPI的JavaScript代码。参考引用:[^1]介绍了FetchAPI的基本用途,它是一个强大的工具,用于在JavaScript中发起网络请求,支持GET和POST等请求,并且可以结合async/await使用。[^2]提到实际使用中,我们会检查response.ok来确定请求是否成功,然后使用json()或text()等方法处理响应体。[^3]提到使用FetchAPI创建新用户(即POST请求)时,我们需要传递一个init对象,其中可以定义方法类型、body、凭证、headers等。[^4]提到FetchAPI被广泛应用于前端框架,并且有一些封装库提供额外功能。因此,我们需要向用户解释如何构造一个Fetch请求,包括:1.请求的URL2.请求方法(GET、POST等)3.请求头(headers)4.请求体(body)——如果是POST、PUT等需要发送数据的请求5.处理响应(检查响应状态,解析响应数据)此外,我们还需要注意:-FetchAPI返回的是Promise,因此我们可以使用then/catch或async/await。-默认情况下,Fetch不会发送或接收cookies,如果需要,需要设置credentials选项。由于用户没有提供具体的网络请求示例,我们将给出一个通用模板,并分别展示GET和POST请求的例子。步骤:1.确定请求的URL和方法。2.如果需要,设置请求头(例如Content-Type、Authorization等)。3.如果需要发送数据,将数据转换为合适的格式(如JSON字符串)并放入body。4.发送请求并处理响应。我们按照这个思路来回答。</think>### 如何将网络请求转换为 Fetch API 格式 将常规网络请求转换为 Fetch API 格式需要以下关键步骤: #### 1. **基本请求结构** ```javascript fetch(url, init) .then(response => { // 处理响应 }) .catch(error => { // 处理错误 }); ``` - `url`:请求地址(必需) - `init`:配置对象(可选) #### 2. **配置对象关键参数** | 参数 | 说明 | 示例值 | |-------------|-----------------------------|--------------------------------| | `method` | 请求方法(GET/POST等) | `'POST'` | | `headers` | 请求头对象 | `{ 'Content-Type': 'application/json' }` | | `body` | 请求体数据(需字符串化) | `JSON.stringify({ name: 'John' })` | | `credentials`| 凭证模式(跨域需`include`) | `'include'` | #### 3. **完整转换示例 **原始请求(假设为 POST)**: ``` POST https://api.example.com/users Content-Type: application/json Authorization: Bearer token123 { "name": "Alice", "age": 30 } ``` **Fetch API 实现**: ```javascript fetch('https://api.example.com/users', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer token123' }, body: JSON.stringify({ name: 'Alice', age: 30 }), credentials: 'include' // 跨域携带cookie时需设置 }) .then(async response => { if (!response.ok) throw new Error('请求失败'); return response.json(); // 解析JSON响应 }) .then(data => console.log(data)) .catch(error => console.error('错误:', error)); ``` #### 4. **关键注意事项** 1. **响应处理**: - 必须检查 `response.ok` 或 `response.status`[^2] - 根据内容类型调用解析方法: ```javascript response.json() // JSON数据 response.text() // 文本/HTML[^3] response.blob() // 二进制数据 ``` 2. **跨域请求**: - 需服务端配置 CORS 响应头 - 携带凭证时设置 `credentials: 'include'` 3. **异步优化**: 推荐使用 `async/await` 简化代码: ```javascript async function fetchData() { try { const response = await fetch(url, options); if (!response.ok) throw new Error(`HTTP错误 ${response.status}`); return await response.json(); } catch (err) { console.error('请求失败:', err); } } ``` #### 5. **常见场景扩展** - **GET 请求带参数**: ```javascript const params = new URLSearchParams({ id: 123 }); fetch(`/api/data?${params}`) ``` - **文件上传**: ```javascript const formData = new FormData(); formData.append('file', fileInput.files[0]); fetch('/upload', { method: 'POST', body: formData // 无需手动设置Content-Type }) ``` > **提示**:对于复杂需求(超时控制/重试机制),可考虑使用 `axios` 或封装 Fetch 的库(如 `fetch-retry`),但原生 Fetch 已能满足大部分场景[^4]。 --- ### 相关问题 1. **如何处理 Fetch API 请求超时?** (原生 Fetch 不支持超时参数,需结合 `AbortController` 实现) 2. **Fetch API 与 XMLHttpRequest 的主要区别是什么?** (Promise 链式调用 vs 回调地狱,更简洁的头部/凭证管理) 3. **如何用 Fetch API 实现请求重试机制?** (封装递归函数配合指数退避算法) 4. **Fetch API 在哪些浏览器兼容性受限?** (IE 完全不支持,旧版移动浏览器需 polyfill) 5. **如何用 Fetch API 下载文件并保存到本地?** (结合 `blob()` 方法和 `URL.createObjectURL()`)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值