首页 > 其他分享 >fetch 与 axios 的对比

fetch 与 axios 的对比

时间:2024-05-15 17:20:10浏览次数:22  
标签:对比 body axios 请求 fetch json response

fetch 与 axios 的对比

fetch 优点:

  1. 使用更方便。fetch 是浏览器原生支持的请求方法,也已直接在浏览器中使用,也可以在代码中随时使用,而不需要像 axios 一样引入第三方包
  2. 脱离了浏览器的 XHR,是 ES 规范里新的实现方式
  3. 是基于 promise 的异步请求

fecth 缺点:

  1. fetch 携带的参数如果是 json 对象需要转换为 json 字符串,axios 可以直接传对象
  2. fetch 只对网络请求报错,对 400,500 都当做成功的请求,需要封装去处理。xhr 自带请求取消、错误等方法,所以服务器返回 4xx 或 5xx 时,axios 会抛出错误,并取消请求
  3. fetch 默认不会带 cookie,需要添加配置项 credentials:'include'才会携带 cookie
  4. fetch 不支持 abort,不支持超时控制,使用 setTimeout 及 Promise.reject 的实现的超时控制并不能阻止请求过程继续在后台运行,造成了量的浪费
  5. fetch 没有办法原生监测请求的进度,而 XHR 可以

axios 优点:

  1. 从浏览器中创建 XMLHttpRequest,基于浏览器的 xhr
  2. 从 node.js 发出 http 请求
  3. 支持 Promise API
  4. 可以拦截请求和响应
  5. 可以转换请求和响应数据
  6. 可以取消请求
  7. 可以自动转换 JSON 数据
  8. 客户端支持防止 CSRF/XSRF
  9. xhr 自带请求取消、错误等方法,所以服务器返回 4xx 或 5xx 时,axios 会抛出错误,并取消请求

axios 缺点:

  1. 使用时需要先安装 axios,引入 axios 并全局挂载 axios,才可以使用

fetch 使用

fetch 语法

fetch(url, options).then(
  (response) => {
    //处理http响应(只有响应成功,即使状态码是400,500,都会在这里显示)
  },
  (error) => {
    //处理错误(只有发生网络错误是会在这里报错)
  },
)

示例:

function fetchGetParams() {
  console.log('fetch-test-get-params')
  const url = 'http://127.0.0.1:8080/get/list?name=zs&age=10'
  const options = {
    method: 'GET',
  }
  fetch(url, options)
    .then((response) => response.json())
    .then((data) => console.log(data))
    .catch((e) => console.log('error', e))
}
function fetchPostParams1() {
  console.log('fetch-test-post-params')
  const url = 'http://127.0.0.1:8080/post/list'
  const params = {
    name: 'postName',
    age: 100,
  }
  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(params),
  }
  fetch(url, options)
    .then((response) => response.json())
    .then((data) => console.log(data))
    .catch((e) => console.log('error', e))
}

请求参数

url :是发送网络请求的地址
options:发送请求参数,
    body : http请求参数
    mode : 指定请求模式。
        cros:允许跨域(为默认值)
        same-origin:只允许同源请求;
        no-cros:只限于get、post和head,并且只能使用有限的几个简单标头。
    cache : 用户指定缓存。
    method : 请求方法,默认GET
    signal : 用于取消 fetch
    headers : http请求头设置
    keepalive : 用于页面卸载时,告诉浏览器在后台保持连接,继续发送数据。
    credentials : cookie设置,
        omit:忽略不带cookie(默认),
        same-origin:同源请求带cookie,
        inclue:无论跨域还是同源都会带cookie。

fetch 请求成功后,响应 response 对象

  • statusText - 服务器返回状态文字描述
  • ok - 返回布尔值,如果状态码 2 开头的,则 true,反之 false
  • status - http 状态码,范围在 100-599 之间
  • headers - 响应头
  • body - 响应体。响应体内的数据,根据类型各自处理。
  • type - 返回请求类型。
  • redirected - 返回布尔值,表示是否发生过跳转。

读取响应数据

  • response 对象根据服务器返回的不同类型数据,提供了不同的读取方法。
  • response.text() -- 得到文本字符串
  • response.json() - 得到 json 对象
  • response.blob() - 得到二进制 blob 对象
  • response.formData() - 得到 fromData 表单对象
  • response.arrayBuffer() - 得到二进制 arrayBuffer 对象

response.json()

response.json()会将返回的数据读取为 json 对象,并返回一个 promise
读取完成,在.then()方法中可以取到 json 形式的返回数据

fetch(url, options)
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((e) => console.log('error', e))

response.body()

body 属性返回一个 ReadableStream 对象,供用户操作,可以用来分块读取内容,显示下载的进度就是其中一种应用
response.body.getReader() 返回一个遍历器 read(),这个遍历器 read() 方法每次都会返回一个对象,表示本次读取的内容块。

const response = await fetch('flower.jpg') // 请求图片
const reader = response.body.getReader() // getReader()获得响应数据
while (true) {
  const { done, value } = await reader.read() // read()遍历响应数据
  // done是一个Boolean值,表示数据是否接收完成
  // value是遍历后的数据,value.length表示数据的字节数
  if (done) {
    break
  }
  console.log(`Received ${value.length} bytes`)
}

get 请求

get 请求的参数必须拼接在请求地址后面

const url = 'http://127.0.0.1:8080/get/list?name=zs&age=10'
const options = {
  method: 'GET',
}
fetch(url, options)

post 请求

post 请求的参数放在 body 里面
需要配置 content-type,但因为 body 是字符串的缘故,浏览器默认给请求 Content-Type 的赋值是 text/plain

body: `user=${user.value}&pas=${pas.value}`

提交 json 数据时,需要把 json 转换成字符串

body: JSON.stringify(json)

提交的是表单数据,使用 formData 转化下吗,上传文件,可以包含在整个表单里一起提交

const data = new FormData()
data.append('file', input.files[0])
data.append('user', 'foo')
body: data

上传二进制数据,将 bolb 或 arrayBuffer 数据放到 body 属性里

body: blob

 来源:https://www.cnblogs.com/guoyanchao/p/16149226.html

标签:对比,body,axios,请求,fetch,json,response
From: https://www.cnblogs.com/huaan011/p/18194313

相关文章

  • LLMOps平台对比 dify vs bisheng
      difybisheng功能完备性、稳定性较为完备和稳定,从模型调优、可观测性、知识库管理等方面都优于bisheng升级全部docker容器搞定,操作简易功能完备性差一些,主要是核心团队在开发,issue较多如:助手运行时调LLM节点报错根据历史版本升级手册,升级操作较为复杂......
  • ClickHouse vs StarRocks 全场景MPP数据库选型对比
    ClickHousevsStarRocks选型对比面向列存的DBMS新的选择Hadoop从诞生已经十三年了,Hadoop的供应商争先恐后的为Hadoop贡献各种开源插件,发明各种的解决方案技术栈,一方面确实帮助很多用户解决了问题,但另一方面因为繁杂的技术栈与高昂的维护成本,Hadoop也渐渐地失去了原本......
  • JS — fetch封装
    functionrequest(url,options={}){constdefaultOptions={method:'GET',headers:{'Content-Type':'application/json',},body:null,};constrequestOptions={...defaultOptions,...option......
  • JDBC连接openGauss6.0和PostgreSQL16.2性能对比
    本文分享自华为云社区《JDBC连接openGauss6.0和PostgreSQL16.2性能对比》,作者:Gauss松鼠会小助手。PostgreSQLvsopenGauss01前置准备安装JDK:详细安装步骤请问度娘,输入能正常返回即已安装[root@db06~]#java-versionopenjdkversion"1.8.0_262"OpenJDKRuntimeEnvir......
  • axios无法加载响应数据:no data found for resource with given identifier
    做一个demo,springboot写好了接口,postman请求也没问题,如下:但是axios请求时,却发生了问题:查了一圈,没发现啥问题,又想起来看下控制台信息跨域的问题?网上也有这么说的,抱着试试的态度在controller上增加了跨域的注解@CrossOrigin重新运行,页面刷新,ok~......
  • Intel平台磁盘随机性能遥遥领先!i7-13700KF VS. 锐龙7 7800X3D对比评测
    一、前言:被大部分玩家忽视的SSD随机性能对于磁盘性能,大家可能会比较在意最高顺序读取速度,这也是厂商宣传的重点,不过相信稍微游戏一些DIY常识的玩家应该都知道,SSD随机性能才是影响实际体验的更关键因素。比如现在的PCIe5.0SSD,顺序读取速度已经可以媲美当年的DDR3内存,然而再强的......
  • Vue项目中有封装过axios吗?主要是封装哪方面的?
    一、axios是什么axios 是一个轻量的 HTTP客户端基于 XMLHttpRequest 服务来执行 HTTP 请求,支持丰富的配置,支持 Promise,支持浏览器端和 Node.js 端。自Vue2.0起,尤大宣布取消对 vue-resource 的官方推荐,转而推荐 axios。现在 axios 已经成为大部分 Vue 开发者的......
  • Doris、StarRocks 压测对比
    先说结论:0、本次测试,未调优二者的参数,开箱起服务,直接测试的,部署架构一致。1、在单表查询下,StarRocks在部分场景下优于Doris,但是二次查询,二者不分伯仲。2、在多表查询下,仅在一个场景下Doris速度逊于StarRocks,大部分场景是Doris优于StarRocks的。3、在cpu和内存的使用上,dori......
  • LoRa与NB-IoT两大低功耗通信技术对比
    在物联网(IoT)的浪潮中,低功耗广域网络(LPWAN)技术成为了连接智能设备的核心。其中,LoRa和NB-IoT作为两大主流技术,凭借各自的特点和优势,在物联网的广阔天地中各自扮演着不可或缺的角色。一、LoRa:广袤天地的通信使者LoRa技术,凭借其独特的扩频调制技术,成为了远距离通信的佼佼者。在全球......
  • C和C++中size sizeof strlen length的对比
    一、sizeof()sizeof是一个操作符,它在编译期间确定的,返回的是静态大小。它可以应用于基本类型、类类型、数组和指针等。例如:sizeof(int)或sizeof(array)。对于数组,sizeof返回整个数组的大小(包括所有元素)。对于指针,sizeof返回指针本身的大小(通常取决于平台和编译器,例如在3......