一次性搞懂axios

打印 上一主题 下一主题

主题 1858|帖子 1858|积分 5574

有没有人和我一样以为axios官方文档读的一愣一愣的?颠末视频课程学习我们梳理一下axios的用法。下面我们话不多说,直接上代码示例:
  1. // axios.html
  2. <p sclass="my-p">
  3. <script>
  4. axios({
  5.         // 请求类型
  6.         method: 'GET',                // 不写默认为GET
  7.         // URL
  8.         url: 'http://xxxxx/yy'
  9. }).then(response =>{
  10.         console.log(result)
  11.         // 将结果插入到p标签
  12.         console.log(result.data.join('<br>'))                // A<br>B<br>C<br>D
  13.         document.querySelector('my-p').innerHTML = result.data.join('<br>')               
  14.         // ABCD每个字母换行输出
  15. })
  16. </script>
复制代码
该代码中,我们请求到了ABCD四个数据,并通过处理惩罚渲染到HTML页面上呈现换行输出的结果
axios介绍

界说:Axios 是一个基于 promise 网络请求库,作用于node.js 和欣赏器中
作用:


  • 从欣赏器创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 超时处理惩罚
  • 查询参数序列化支持嵌套项处理惩罚
  • 自动将请求体序列化为:
  • JSON (application/json)
  • Multipart / FormData (multipart/form-data)
  • URL encoded form (application/x-www-form-urlencoded)
  • 将 HTML Form 转换成 JSON 举行请求
  • 自动转换JSON数据
  • 获取欣赏器和 node.js 的请求进度,并提供额外的信息(速度、剩余时间)
  • 为 node.js 设置带宽限制
  • 兼容符合规范的 FormData 和 Blob(包括 node.js)
  • 客户端支持防御XSRF
安装:npm install axios 或 yarn add axios
为了直接使用 require 导入预构建的 CommonJS 模块(假如您的模块打包器无法自动解析它们),我们提供了以下预构建模块:
  1. const axios = require('axios/dist/browser/axios.cjs'); // browser
  2. const axios = require('axios/dist/node/axios.cjs'); // node
复制代码
接口文档

接口文档:描述接口的文章
接口:使用AJAX和服务器通讯时使用的URL、请求方法、参数

注意:axios会将data中的对象默认转成json格式的数据
URL

界说:统一资源定位符
组成:协议(http) + 域名(baidu.com) + 资源路径(api/xxx)
如:http://baidu.com/api/xxx
HTTP协议【超文本传输协议】

界说:规定了欣赏器发送及服务器返回内容的格式
HTTP报文的运动方向:一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到“服务器”,在服务器工作完成之后,报文又会从“服务器”流到“代理”再流到“客户端”。
请求报文

界说:欣赏器按照HTTP协议要求的格式,发送给服务器的内容

组成部分:

  • 请求行请求方法、URL、协议
  • 请求头:以键值对的格式携带的附加信息,如:Content-Type(欣赏器携带的内容范例)
  • 空行:分割请求头,空行之后是发送给服务器的资源
  • 请求体:发送的资源,包含所有二进制数据和文本。

① 常见的请求方法
请求方法操作GET获取数据POST提交数据PUT修改数据(全部)DELETE删除数据PATCH修改数据(部分) ② 常见的请求头
Content-Type:内容的范例
常见范例寄义text/html用于欣赏器间响应x-www-form-urlencoded纯⽂本表单的提交⽅式multitype/form-data含有⼆进制⽂件时的提交⽅式application/jsonjson格式 Content-Length:指定 Body 的⻓度(字节)
Location:指定重定向的⽬标 URL
User-Agent:⽤户代理,便是谁发送或继承响应的,可以用来区分欣赏器发送的请求还是手机发送的请求。
错误排查

网络请求查看:F12 ———> Fetch/XHR:过滤监测请求方式
标头:请求行、请求头;载荷:请求体

发送登录验证出现错误,右键密码点击查抄,将type=password改为type=text,发现密码正确。查抄网络请求报文传输的数据,发现误将密码的值写成用户名的值

响应报文

界说:服务器按HTTP协议要求的格式,返回给欣赏器的内容

组成部分:

  • 响应行:协议、HTTP响应状态码、状态信息
  • 响应头:以键值对的格式携带的附加信息,如:Content-Type
  • 空行:分割请求头,空行之后是发送给服务器的资源
  • 响应体:返回的资源

① HTTP响应状态码:表明请求是否乐成
状态码说明1xx服务器收到请求,需要继续处理惩罚。如101表现服务器将关照客户端使用更高版本的HTTP协议2xx请求乐成。如200表现请求盼望的响应头或数据体将随此响应返回3xx重定向。如302表现暂时重定向,请求将包含一个新的URL地址,客户端将会对新地址举行GET请求4xx客户端错误。如404表现客户端请求资源不存在5xx服务器错误。如500表现服务器遇到意料外的环境,导致无法完成响应 URL 查询参数

界说:欣赏器提供给服务器的额外信息,让服务器返回欣赏器想要的数据
语法:http://xxxx.com/yyy?参数名1=值1&参数名2=值2

axios查询参数:params

  1. // 目标资源地址?参数名1=值1&参数名2=值2
  2. axios({
  3.         url: '目标资源地址',
  4.         params: {
  5.                 参数名1: 值1,        // 属性名为后端定义,属性值为变量随便写
  6.                 参数名2: 值2        // es5中若参数名与值相同则可简写为一个
  7.         }
  8. }).then(res => {
  9.         // 数据处理
  10. })
复制代码
axios设置

请求设置 Request Config

  1. {
  2.         url: '/user',
  3.         method: 'get',
  4.         baseURL: 'http://xxx.com/api/'        ,        // 默认地址
  5.        
  6.         // 处理发送请求的数据
  7.         transformRequest: [function (data, headers) {       
  8.             // Do whatever you want to transform the data
  9.             return data;
  10.           }],
  11.          
  12.           // 处理接收响应的数据
  13.           transformResponse: [function (data) {               
  14.             // Do whatever you want to transform the data
  15.             return data;
  16.           }],
  17.          
  18.           // 请求头
  19.           headers: {'X-Requested-With': 'XMLHttpRequest'},
  20.          
  21.           // 查询参数 http://xxx.com/api/user?ID=1234
  22.           params: {               
  23.                 ID: 1234       
  24.         },               
  25.           data: 'Country=Brasil&City=Belo Horizonte',               
  26.          
  27.           // 延迟中断时间
  28.           timeout: 1000,
  29.          
  30.           // 跨域请求时对cookie携带设置
  31.           withCredentials: false, // 默认不携带
  32.          
  33.           // 对请求的适配器做设置【①AJAX ②nodejs的HTTP请求】
  34.           adapter: function (config) {
  35.             /* ... */
  36.     }
  37.    
  38.     // 设置用户名密码。【使用较少】
  39.     auth: {
  40.                   username: 'janedoe',
  41.                   password: 's00pers3cret'
  42.         },
  43.        
  44.         // 设置响应体
  45.         responseType: 'json',                // default
  46.         // 设置响应结果编码字符集
  47.          responseEncoding: 'utf8',                 // default
  48.          // 设置跨域标识(安全设置,保证是自己的客户端而不是未知的,避免跨站攻击)
  49.          xsrfCookieName: 'XSRF-TOKEN',                 // default
  50.          xsrfHeaderName: 'X-XSRF-TOKEN',                 // default
  51.          
  52.          // 设置上传和下载时的回调
  53.          onUploadProgress: function ({loaded, total, progress, bytes, estimated, rate, upload = true}) {
  54.             // Do whatever you want with the Axios progress event
  55.           },
  56.          onDownloadProgress: function ({loaded, total, progress, bytes, estimated, rate, download = true}) {
  57.             // Do whatever you want with the Axios progress event
  58.           },
  59.         // 设置HTTP响应体的最大尺寸        【字节】
  60.         maxContentLength: 2000,
  61.         // 设置HTTP请求体的最大尺寸        【字节】
  62.         maxBodyLength: 2000,
  63.         // 设置响应结果的成功的范围
  64.         validateStatus: function (status) {
  65.             return status >= 200 && status < 300;         // default
  66.           },
  67.           
  68.          // 设置最大跳转次数【nodejs中使用】
  69.          maxRedirects: 21,         // default
  70.          // 重定向请求中添加认证或其他自定义行为
  71.          beforeRedirect: (options, { headers }) => {
  72.             if (options.hostname === "example.com") {
  73.               options.auth = "user:password";
  74.             }
  75.           },
  76.         // 向docker的守护进程发送请求
  77.         // Only either `socketPath` or `proxy` can be specified.
  78.         socketPath: null,                // default
  79.         // nodejs代理配置
  80.         proxy: {
  81.             protocol: 'https',
  82.             host: '127.0.0.1',
  83.             // hostname: '127.0.0.1' // Takes precedence over 'host' if both are defined
  84.                    port: 9000,
  85.             auth: {
  86.                       username: 'mikeymike',
  87.                       password: 'rapunz3l'
  88.                  }
  89.         }
  90.        
  91.         // 取消Ajax请求
  92.         cancelToken: new CancelToken(function (cancel) {}),
  93. }
复制代码
响应结构 Response Config

  1. {
  2.   // `data` is the response that was provided by the server
  3.   data: {},
  4.   // `status` is the HTTP status code from the server response
  5.   status: 200,
  6.   // `statusText` is the HTTP status message from the server response
  7.   statusText: 'OK',
  8.   // `headers` the HTTP headers that the server responded with
  9.   // All header names are lowercase and can be accessed using the bracket notation.
  10.   // Example: `response.headers['content-type']`
  11.   headers: {},
  12.   // `config` is the config that was provided to `axios` for the request
  13.   config: {},
  14.   // `request` is the request that generated this response
  15.   // It is the last ClientRequest instance in node.js (in redirects)
  16.   // and an XMLHttpRequest instance in the browser
  17.   request: {}
  18. }
复制代码
代码示例

GET请求
  1. axios({
  2.         url:‘请求的网址’,
  3.         method:'get',                // 可省略
  4.         params: {                                // 查询参数
  5.                 参数名1: 值1,        // 属性名为后端定义,属性值为变量随便写
  6.                 参数名2: 值2        // es6中若参数名与值相同则可简写为一个
  7.         }
  8. }).then()
复制代码
POST请求
  1. axios({
  2.         url:‘请求的网址’,
  3.         method:'post',
  4.         data:{                // 提交数据
  5.                 属性名1: '属性值1',
  6.                 属性名2: '属性值2'
  7.         }
  8. }).then()
复制代码
axios错误处理惩罚

  1. axios({
  2.         // 请求选项
  3. }).then(result => {
  4.         // 处理数据
  5. }).catch(error => {
  6.         // 处理错误
  7.         console.log(error)
  8.         alert(error.data.xxx)                // 显示错误信息
  9. })
复制代码
axios默认设置

默认请求范例axios.default.method = 'GET'
默认基础URLaxios.default.baseURL = 'http://localhost:3000'
默认请求参数axios.default..params = { id:100 }
axios自界说实例

  1. const instance = axios.create({
  2.   baseURL: 'https://api.example.com',
  3.   timeout: 2000
  4. });
  5. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  6. // 用法一
  7. instance({
  8.         url: '/user',
  9. }).then({})
  10. // 用法二
  11. instance.get('/user').then({})
复制代码
axios请求别名

axios.request(config)
  1. axios.request({
  2.         method: 'GET',
  3.         url: 'URL'
  4. }).then(response => {
  5.         console.log(response)
  6. })
复制代码
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, data[, config]])
  1. axios.post('URL',{
  2.         // data请求体对象
  3. }).then({})
复制代码
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
axios拦截器

作用:在请求或响应被 then 或 catch 处理惩罚前拦截它们。
执行顺序:
①请求拦截器:发送请求前借助回调函数对参数和内容举行查抄和处理惩罚【代码后进先执行】
②响应拦截器:结果吸取之前举行查抄或预处理惩罚【代码后进后执行】
③最后再由用户自界说处理惩罚
  1. // 设置请求拦截器
  2. axios.interceptors.request.use(function (config) {
  3.     // 在发送请求之前做些什么
  4.     console.log('请求拦截器 成功')
  5.     return config;
  6.   }, function (error) {
  7.     // 对请求错误做些什么
  8.     console.log('请求拦截器 失败')
  9.     return Promise.reject(error);
  10.   });
  11. // 设置响应拦截器
  12. axios.interceptors.response.use(function (response) {
  13.     // 2xx 范围内的状态码都会触发该函数。
  14.     // 对响应数据做点什么
  15.      console.log('响应拦截器 成功')
  16.     return response;
  17.   }, function (error) {
  18.     // 超出 2xx 范围的状态码都会触发该函数。
  19.     // 对响应错误做点什么
  20.     console.log('响应拦截器 失败')
  21.     return Promise.reject(error);
  22.   });
  23. // 发送请求
  24. axios({
  25.         method: 'GET',
  26.         url: 'http://localhost:3000/api'
  27. }).then(response => {
  28.         console.logI('自定义回调处理成功结果')
  29. }).catch(error => {
  30.         console.logI('自定义回调失败')
  31. })
复制代码
axios取消请求

AbortController【v0.22.0 开始,Axios 支持以 fetch API 方式取消请求】
  1. const controller = new AbortController();
  2. axios.get('/foo/bar', {
  3.    signal: controller.signal
  4. }).then(function(response) {
  5.    //...
  6. });
  7. // 取消请求
  8. controller.abort()
复制代码
CancelToken【此 API 从 v0.22.0 开始已被弃用,不应在新项目中使用。】
方法1:使用 CancelToken.source 工厂方法创建一个 cancel token
  1. const CancelToken = axios.CancelToken;
  2. const source = CancelToken.source();
  3. axios.get('/user/12345', {
  4.   cancelToken: source.token
  5. }).catch(function (thrown) {
  6.   if (axios.isCancel(thrown)) {
  7.     console.log('Request canceled', thrown.message);
  8.   } else {
  9.     // 处理错误
  10.   }
  11. });
  12. axios.post('/user/12345', {
  13.   name: 'new name'
  14. }, {
  15.   cancelToken: source.token
  16. })
  17. // 取消请求(message 参数是可选的)
  18. source.cancel('Operation canceled by the user.');
复制代码
方法2:通过通报一个 executor 函数到 CancelToken 的构造函数来创建一个 cancel token。可通过cancel的值判定请求是否发送了
  1. const CancelToken = axios.CancelToken;
  2. // 2. 声明全局变量
  3. let cancel = null;
  4. // 检测上一次的请求是否已经完成
  5. if(cancel !== null){    // 未完成
  6.         // 取消上一次的请求
  7.         cancel();
  8. }
  9. axios.get('/user/12345', {
  10.         // 1. 添加配置对象的属性
  11.    cancelToken: new CancelToken(function executor(c) {                // executor 函数接收一个 cancel 函数作为参数
  12.     // 3. 将 c 的值赋给 cancel
  13.     cancel = c;
  14.   })
  15. }).then(response => {
  16.         console.log(response)
  17.         // 将cancel的值初始化
  18.         cancel = null
  19. })
  20. // 取消请求
  21. cancel();
复制代码
上面代码实现的结果:在上一次消息未发送完成时,每次点击发送请求的按钮都会取消上一次的请求。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表