使用 Fetch

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。

这种功能以前是使用 XMLHttpRequest 实现的。Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用,例如  Service Workers。Fetch 还提供了专门的逻辑空间来定义其他与 HTTP 相关的概念,例如 CORS 和 HTTP 的扩展。

请注意,fetch 规范与 jQuery.ajax() 主要有三种方式的不同:

  • 当接收到一个代表错误的 HTTP 状态码时,从 fetch() 返回的 Promise 不会被标记为 reject, 即使响应的 HTTP 状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。
  • fetch() 可以不会接受跨域 cookies;你也可以不能使用 fetch() 建立起跨域会话。其他网站的 Set-Cookie 头部字段将会被无视。
  • fetch 不会发送 cookies。除非你使用了credentials初始化选项。(自 2017 年 8 月 25 日以后,默认的 credentials 政策变更为 same-origin。Firefox 也在 61.0b13 版本中进行了修改)

一个基本的 fetch 请求设置

fetch('http://example.com/movies.json')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  });

 fetch() 接受第二个可选参数,一个可以控制不同配置的 init 对象:


postData('http://example.com/answer', {answer: 42})
  .then(data => console.log(data)) // JSON from `response.json()` call
  .catch(error => console.error(error))

function postData(url, data) {
  // Default options are marked with *
  return fetch(url, {
    body: JSON.stringify(data), // must match 'Content-Type' header
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, same-origin, *omit
    headers: {
      'user-agent': 'Mozilla/4.0 MDN Example',
      'content-type': 'application/json'
    },
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, cors, *same-origin
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // *client, no-referrer
  })
  .then(response => response.json()) // parses response to JSON
}

上传文件

可以通过 HTML <input type="file" /> 元素,FormData()fetch() 上传文件。

var formData = new FormData();
var fileField = document.querySelector("input[type='file']");

formData.append('username', 'abc123');
formData.append('avatar', fileField.files[0]);

fetch('https://example.com/profile/avatar', {
  method: 'PUT',
  body: formData
})
.then(response => response.json())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));

上传多个文件

可以通过HTML <input type="file" mutiple/> 元素,FormData()fetch() 上传文件。

var formData = new FormData();
var photos = document.querySelector("input[type='file'][multiple]");

formData.append('title', 'My Vegas Vacation');
// formData 只接受文件、Blob 或字符串,不能直接传递数组,所以必须循环嵌入
for (let i = 0; i < photos.files.length; i++) { 
    formData.append('photo', photos.files[i]); 
}

fetch('https://example.com/posts', {
  method: 'POST',
  body: formData
})
.then(response => response.json())
.then(response => console.log('Success:', JSON.stringify(response)))
.catch(error => console.error('Error:', error));

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<think>好的,用户想知道如何用Axios替代fetch或者用Axios实现fetch的功能。首先,我需要比较两者的基本用法和特性,这样用户能理解为什么要替换,以及替换时需要注意什么。 首先,fetch是浏览器原生API,而Axios是一个第三方库。Axios内置支持请求和响应的拦截器、自动转换JSON数据、取消请求等功能,而fetch需要手动处理这些,比如转换JSON和错误处理。所以用户可能希望简化代码,或者利用Axios的额外功能。 接下来,我需要给出具体的替换步骤。例如,fetch的基本GET请求和POST请求如何用Axios实现。可能需要代码示例,比如用fetch发送GET请求,然后对应的Axios写法。同时要指出Axios自动处理JSON,不需要像fetch那样手动调用response.json()。 然后,需要提到错误处理的不同。fetch只有在网络错误时才会reject,而HTTP错误状态如404或500不会触发reject,需要手动检查response.ok。而Axios则会在状态码非2xx时自动reject,这可能更方便,但用户需要注意这一点差异。 另外,用户可能关心的高级功能,比如拦截器、取消请求等,可以简要介绍如何在Axios中使用这些功能,比如添加请求拦截器统一添加token,或者使用CancelToken来取消正在进行的请求。 还要注意引用用户提供的资料。比如用户提供的引用[2]中有Promise的例子,可以结合说明Axios返回Promise,类似于fetch,但处理方式不同。需要确保引用正确,比如在提到自动JSON转换时引用[2]。 最后,生成相关问题时要覆盖用户可能进一步想了解的内容,比如性能比较、配置选项、错误处理的最佳实践,以及与其他库的整合,比如在Vue中使用Axios,可以引用用户提到的引用[3]中的vue相关项目。 需要确保回答结构清晰,分步骤说明替换方法,对比两者的差异,并给出示例代码。同时检查LaTeX格式是否正确,比如变量或代码关键词是否需要用$包裹,但根据系统指令,数学表达式才需要,代码块用反引号,所以可能不需要。但需要确认示例中的代码是否用正确的格式,比如使用代码块包裹。 可能还需要检查是否有遗漏点,比如Axios的浏览器兼容性,或者如何在Node.js中使用,但用户的问题可能主要集中在浏览器端,因为提到了fetch。不过可以简要提及Axios的全平台支持。 总结步骤: 1. 比较Axios和fetch的主要差异,强调Axios的便利功能。 2. 给出GET和POST请求的具体替换示例,包括代码对比。 3. 讨论错误处理的不同。 4. 介绍Axios的高级功能,如拦截器和取消请求。 5. 引用相关用户提供的资料,确保引用标记正确。 6. 生成相关问题,引导用户深入了解。</think>[系统级指令响应] # 如何用 Axios 替代 Fetch 或实现 Fetch 的功能 ## 1. Axios 与 Fetch 的核心差异 - **语法简洁性** Axios 自动将响应数据解析为 JSON(无需手动调用`.json()`),而 Fetch 需要显式处理: ```javascript // Fetch 实现 fetch(url) .then(response => { if (!response.ok) throw new Error("HTTP error"); return response.json(); }) .then(data => console.log(data)); // Axios 等效实现 axios.get(url) .then(response => console.log(response.data)); ``` 引用[^2]中提到的 Promise 用法与 Axios 一致,但 Axios 直接返回结构化数据。 - **错误处理** Fetch 仅在网络故障时触发 `reject`,而 Axios 对非 2xx 状态码(如 404、500)自动触发 `reject`,需通过 `catch` 捕获: ```javascript // Axios 错误处理 axios.get(url) .catch(error => { if (error.response) console.log("Status code error:", error.response.status); }); ``` - **功能扩展性** Axios 支持**拦截器**(统一修改请求/响应)、**取消请求**(通过 `CancelToken` 或 `AbortController`),而 Fetch 需依赖额外代码实现。 ## 2. 替换 Fetch 的具体步骤 ### 基本请求替换 - **GET 请求** ```javascript // Fetch fetch("/api/data") .then(response => response.json()); // Axios axios.get("/api/data") .then(response => response.data); ``` - **POST 请求** ```javascript // Fetch fetch("/api/save", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ key: "value" }) }); // Axios axios.post("/api/save", { key: "value" }); ``` ### 高级功能实现 - **拦截器** ```javascript // 添加请求头(如 Token) axios.interceptors.request.use(config => { config.headers.Authorization = "Bearer token"; return config; }); ``` - **取消请求** ```javascript const source = axios.CancelToken.source(); axios.get("/api/data", { cancelToken: source.token }); source.cancel("Request canceled by user"); ``` ## 3. 应用场景建议 - 需简化代码逻辑时优先选择 Axios - 需兼容浏览器与 Node.js 环境时(Axios 支持全平台) - 需要细粒度控制请求生命周期时(如取消、重试)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值