React:Axios

axios可以在浏览器和node.js两边跑,可以向服务端发起ajax请求,也可以在node.js里运行,向远端服务发送http请求

Axios中文文档 | Axios中文网

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
<script src="https://unpkg.com/axios@1.6.7/dist/axios.min.js"></script>

</head>
<body>
    <script>
        console.log(axios)
        
    </script>
</body>
</html>

获取失败了,报错404了

查了半夜发现前后端端口号不同涉嫌跨域(CORS)问题,此时要么修改前端,要么修改后端,消除跨域问题

我选择了把二者端口号改成一样的,就不跨域了

json-server --watch db.json --port 8080

好了,现在变成这样了,报错还是404

GPT用它最后的波纹告诉我,用liver server,会自动帮我运行一个静态服务器

再把后端端口号改为和前端一样的就好了

这么重要的东西为什么没人说!!

axiosAPI接口

axios(配置)
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>axios基本使用</title>
    <link crossorigin="anonymous" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
</head>
<body>
    <div class="container">
        <h2 class="page-header">基本使用</h2>
        <button class="btn btn-primary"> 发送GET请求 </button>
        <button class="btn btn-warning" > 发送POST请求 </button>
        <button class="btn btn-success"> 发送 PUT 请求 </button>
        <button class="btn btn-danger"> 发送 DELETE 请求 </button>
    </div>
    <script>
        //获取按钮
        const btns = document.querySelectorAll('button');
        //第一个按钮
btns[0].onclick=function(){
    //发送ajax请求
    axios(
        {
            //请求类型:GET
            method:'GET',
            //请求URL,注意端口号
            url:'http://localhost:52896'
        }).then(reponse=>{
            console.log(reponse)
            
        })
   
}
    </script>
</body>

</html>

点击get发送请求

axios是基于promise的,他的每个请求(如 getpostput 等)都返回一个promise,因为直接返回的是一个promise,所以后面可以直接接then来处理成功/失败的回调函数

axios请求成功后,会将服务器的响应封装成一个 响应对象,并传递给 .then() 的回调函数。

然后把reponse当作一个axios封装的响应对象做为参数传入回调函数内

可以看见异步请求成功

为什么我的打开里面不是数据

原来是我的url错了

这下对了

如果在浏览器里一闪就过去了,需要在浏览器保留日志

axios就像封装了ajax的promise

请求方法别名

为方便起见,已为所有常见的请求方法提供了别名。

axios.request(config)

  btns[0].onclick=function(){ 
    axios.request({
        method:'GET',
        url:'http://localhost:52896/comments'
    }).then(response=>{
        console.log(response)
    })
}

axios.post(url[, data[, config]])

data为请求体,config是可选选项

btns[1].onclick=function(){
    axios.post(
        'http://localhost:52896/comments',
      {"body": "喜大普奔",
      "postId": 2
    }
).then(response=>{
        console.log(response)
    })
}

axios响应对象

每次发送请求,就会返回一个axios响应对象,这是它的具体结构

config是配置对象 ,里面包含了请求类型,请求url,请求体

data是响应体,也就是服务器返回的结果

data为什么是个对象?是因为axios自动将返回的json转为对象,方便对结果进行处理

headers是相应的头信息

request保存的是原生的Ajax请求对象 ,axios发送Ajax请求需要用到XMLHttpRequest

毕竟官网说了👇

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests

下面的200是响应的状态码,OK是响应的状态字符串

Config

一些配置对象的说明

{
  //url是指明请求要发给谁,完整的请求地址
  url: '/user',

  // 设置请求类型
  method: 'get', 

 // 设定url的基础结构,也就是请求的根路径
 //axios内部会自动将url和baseURL做结合,获取最终的url结果

 //简化请求路径,可以只写后面的路径,不用写域名和协议
  baseURL: 'https://some-domain.com/api/',


  //对请求的数据做处理,向服务器发送处理后的结果
  transformRequest: [function (data, headers) {
    return data;
  }],

  //也是对请求的数据做处理,发送给服务器处理后的结果
    transformResponse: [function (data) {
    return data;
  }],

 //配置请求头信息,在某些项目进行身份校验,可以在头信息里进行配置
  headers: {'X-Requested-With': 'XMLHttpRequest'},

//是一个对象,可以将数据以查询参数的形式附加到url里
//未使用 params 的 URL: https://api.example.com/data
//使用 params 的 URL: https://api.example.com/data?name=John&age=30
params: {
    ID: 12345
  },

//参数序列化的配置项,用的相对较少,对请求的参数做序列化,将 params 对象转换为 URL 查询字符串
 paramsSerializer: {
    encode?: (param: string): string => {  }, 
    serialize?: (params: Record<string, any>, options?: ParamsSerializerOptions ), 
    indexes: false  
  },

//超时时间
 timeout: 1000, 
//跨域请求时是否携带cookie
 withCredentials: false,

//对请求设置,一种是ajax,一种是在node.js里发送http
  adapter: function (config) {
    /* ... */
  },

//设置用户名和密码,对请求基础验证
 auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

//对响应体类型的设置,默认是json,在返回的时候从json会转为对象
responseType: 'json',

//响应结果的编码
 responseEncoding: 'utf8',

//跨域请求,对cookie的名字进行设置
xsrfCookieName: 'XSRF-TOKEN',

//设置头信息
xsrfHeaderName: 'X-XSRF-TOKEN',

//安全设置,保证请求来自自己的客户端,保护作用
 withXSRFToken: boolean | undefined | ((config: InternalAxiosRequestConfig) => boolean | undefined),

//上传的时候进行回调
onUploadProgress: function ({loaded, total, progress, bytes, estimated, rate, upload = true}) {
  },

//下载的时候进行回调 
 onDownloadProgress: function ({loaded, total, progress, bytes, estimated, rate, download = true}) {
  },

//设置http响应的最大尺寸
maxContentLength: 2000,

//设置请求体的最大尺寸
  maxBodyLength: 2000,

//对响应结果的成功做设置
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },

//最大跳转次数,向一个服务发起请求后要跳转,做完跳转是否要继续请求的次数限制
//一般用在node.js里,ajax里用不到
maxRedirects: 21, //默认值

//
  beforeRedirect: (options, { headers }) => {
    if (options.hostname === "example.com") {
      options.auth = "user:password";
    }
  },
//设置socket文件的位置
socketPath: null, 

//很有用,设置代理,用在服务端
  proxy: {
    protocol: 'https',
    host: '127.0.0.1',
    // hostname: '127.0.0.1' // Takes precedence over 'host' if both are defined
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

//对ajax请求取消
  cancelToken: new CancelToken(function (cancel) {
  }),

//对响应结果是否做解压,默认解压,ajax用不了,在node用
decompress: true, // default

//httpAgent是对客户端连接的设置
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),


}

axios的默认配置

把重复的设置配在默认里,简化代码

比如配置默认路径,url可以不用写这么长;配置默认请求

      axios.default.method='GET'//设置默认的请求类型为GET
        axios.default.baseURL='http://localhost:52896'

设置默认params,把id加到url后面

        axios.defaults.params={id:100}
        axios.defaults.timout=3000

 axios创建实例对象发送ajax请求

axios.create()来实例化

        //获取按钮
        const btns = document.querySelectorAll('button')
        //创建实例对象
const duanzi=axios.create(
    {
        baseURL:'https//api.apiopen.top',
        timeout:2000
    }
)
//这里duanzi与axios对象功能几近是一样的
console.log(duanzi)

打印到控制台

//拿duanzi当axios使用,因为他是axios的实例化对象
duanzi({
    url:'/getJoke',
}).then(reponse=>{
    console.log(reponse)
})

用实例对象使用请求方法

duanzi.get('/getJoke').then(response=>{
    console.log(response.data)
})

如果有跨域的问题,例如我们的项目如果不是来源单一的服务器,就可以创建两个对象

const duanzi=axios.create(
    {
        baseURL:'https://api.apiopen.top',
        timeout:2000
    }
)
const another=axios.create({
    baseURL:'https://b.cm',
    timeout:2000
})

拦截器

拦截器的本质是一些函数

拦截器分为请求拦截器和响应拦截器

请求拦截器可以在发送请求之前,用回调函数对请求内容和参数做处理,如果没问题则请求正常发送,如果有问题,请求取消

响应拦截器可以在处理结果之前处理,做一个提醒或者记录,或者对数据接口做一些格式化的处理,有问题交由我们自己的回调函数处理,在响应拦截器里做处理

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
    <title>Document</title>
  </head>
  <body>
    <script>
//内部还是promise实现的
      // 设置请求拦截器
      axios.interceptors.request.use(
        function (config) {
          console.log('请求拦截器 成功')
          return config
        },
        function (error) {
          console.log('请求拦截器 失败')
          return Promise.reject(error)
        }
      )
 
      // 设置相应拦截器
      axios.interceptors.response.use(
        function (response) {
          console.log('响应拦截器成功')
          return response
        },
        function (error) {
          console.log('响应拦截器 失败')
          return Promise.reject(error)
        }
      )
      //发送请求
      axios({
        method:'GET',
        url:'https://localhost:3000/posts'
      }).then(response=>{
        console.log(response)
      }).catch(reason=>{
        console.log('自定义失败回调')
      })
    </script>
  </body>
</html>

请求拦截器是后进入的先执行,响应拦截器是先进入先执行

在请求拦截器中我们可以修改config的配置:

   axios.interceptors.request.use(
        function (config) {
          console.log('请求拦截器 成功2号 ')
            config.params={a:100}
          return config
        },

返回的数据

 axios取消请求

发送一个请求

const btns=document.querySelectorAll('button')

btns[0].onclick=function(){
    axios({
        method:'GET',
        url:'http://localhost:52896/posts'
    }).then(response=>{
       console.log(response)
        
    })
}
   

如何取消请求

const btns=document.querySelectorAll('button')
//声明全局变量
//cancel初始值是null
let cancel=null
btns[0].onclick=function(){
    axios({
        method:'GET',
        url:'http://localhost:52896/posts',
        //1、添加配置对象的属性
        cancelToken:new axios.CancelToken(function(c){
            //3、将c的值赋值给cancel
            cancel=c
        })
    }).then(response=>{
       console.log(response)
        
    })
}
btns[1].onclick=function(){
    cancel()
}

把发送的时间延迟,就可以计时取消,或者把网络调慢点,我这里是slow 4g

可以在发送完成前取消

如果在发送请求完成前多次点击发送,设置一个自动取消上次请求的功能

//获取按钮
const btns=document.querySelectorAll('button')
//声明全局变量
let cancel=null
btns[0].onclick=function(){

    //检测上一次请求是否完成
    if(cancel!==null){
        cancel()
    }
    axios({
        method:'GET',
        url:'http://localhost:52896/posts',
        //1、添加配置对象的属性
        cancelToken:new axios.CancelToken(function(c){
            //3、将c的值赋值给cancel
            cancel=c
        })
    }).then(response=>{
       console.log(response)
        cancel=null
    })
}
btns[1].onclick=function(){
    cancel()
}

还欠了一篇axios源码分析。。。以后再学吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出

使用 vxe-table 导出 excel&#xff0c;支持带数值、货币、图片等带格式导出&#xff0c;通过官方自动的导出插件 plugin-export-xlsx 实现导出功能 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;htt…

C# Unity 唐老狮 No.7 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式

见字如面&#xff0c;这里是AKA AIGC创意人竹相左边。 学习使用了三年的AI工具&#xff0c;现在最大的自信就是业余时间可以学习任何自己感兴趣的事&#xff0c;感觉手搓火箭也不是梦。 今天开个新坑&#xff0c;也是逐步探索想要进入的新世界。物联网&#xff08;IoT&#…

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…

MacOS Big Sur 11 新机安装brew wget python3.12 exo

MacOS Big Sur 11,算是很老的系统了&#xff0c;所以装起来brew有点费劲。 首先安装brew 官网&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 官网加速&#xff1a; 按照官网的方法&#xff0…

C++算法——差分

1.差分 差分与前缀和的核心思想相同&#xff0c;是预处理&#xff0c;可以在暴力枚举的过程中&#xff0c;快速给出查询的结果&#xff0c;从而优化时间复杂度。 是经典的用空间替换时间的做法。 补充&#xff1a;使得最短跳跃距离尽可能长&#xff0c;遇到类似这样的问题时…

【VBA】WPS/PPT设置标题字体

通过VBA&#xff0c;配合左上角的快速访问工具栏&#xff0c;实现自动化调整 选中文本框的 字体位置、大小、颜色。 配合quicker更加便捷 Sub DisableAutoWrapAndFormat()Dim shp As Shape 检查是否选中了一个形状&#xff08;文本框&#xff09;If ActiveWindow.Selection.Typ…

YOLO 各系列结构整理

目录 2016 You Only Look Once: Unified, Real-Time Object Detection(CVPR) 2017 YOLO9000: Better, Faster, Stronger CVPR 2018 YOLOv3:AnIncrementalImprovemen CVPR YOLO V3-SPP 2020 YOLOv4: Optimal Speed and Accuracy of Object Detection 2021 YOLOV5 2021 YOL…

六十天前端强化训练之第十四天之深入理解JavaScript异步编程

欢迎来到编程星辰海的博客讲解 目录 一、异步编程的本质与必要性 1.1 单线程的JavaScript运行时 1.2 阻塞与非阻塞的微观区别 1.3 异步操作的性能代价 二、事件循环机制深度解析 2.1 浏览器环境的事件循环架构 核心组件详解&#xff1a; 2.2 执行顺序实战分析 2.3 Nod…

Git基础之工作原理

基础概念 git本地有三个工作区域&#xff0c;工作目录 Working Directory&#xff0c;暂存区Stage/Index和资源区Repository/Git Directory&#xff0c;如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace&#xff1a;工作区&#xff0c;就…

【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率

计算机网络的性能指标 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是&#xff1a;网速、最高网速和实时网速。 相信大家看到这三个词应该就…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放&#xff0c;为了方便使用者更加自由的使用大模型&#xff0c;将大模型变成如同棒球棍一样每个人都能用&#xff0c;并且顺手方便的工具&#xff0c;本地私有化具有重要意义。 本次测试使用ollama完成模型下载&#xff0c;过程简单快捷。 1、进…

【实战篇】【DeepSeek 全攻略:从入门到进阶,再到高级应用】

凌晨三点,某程序员在Stack Overflow上发出灵魂拷问:“为什么我的DeepSeek会把财务报表生成成修仙小说?” 这个魔性的AI工具,今天我们就来场从开机键到改造人类文明的硬核教学。(文末含高危操作集锦,未成年人请在师父陪同下观看) 一、萌新村任务:把你的电脑变成炼丹炉 …

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…

linux如何判断进程对磁盘是随机写入还是顺序写入?

模拟工具&性能测试工具&#xff1a;fio fio参数说明&#xff1a; filename/dev/sdb1&#xff1a;测试文件名称&#xff0c;通常选择需要测试的盘的data目录。 direct1&#xff1a;是否使用directIO&#xff0c;测试过程绕过OS自带的buffer&#xff0c;使测试磁盘的结果更真…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

Leetcode 刷题记录 06 —— 矩阵

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 矩阵置零 方法一&#xff1a;标记数组 方法二&#xff1a;两个标记变量 02 螺旋矩阵…

Elasticsearch:使用 BigQuery 提取数据

作者&#xff1a;来自 Elastic Jeffrey Rengifo 了解如何使用 Python 在 Elasticsearch 中索引和搜索 Google BigQuery 数据。 BigQuery 是 Google 的一个平台&#xff0c;允许你将来自不同来源和服务的数据集中到一个存储库中。它还支持数据分析&#xff0c;并可使用生成式 AI…