axios

axios

json-server搭建

https://github.com/typicode/json-server/blob/main/README.md

  1. 打开github文档,根据自己的nodejs版本选择json-server的版本。我的nodejs版本为16开头,安装json-server的命令如下:

    复制代码
    npm install -g [email protected]
  2. 在文件夹下新建一个db.json文件,将文档中的信息复制进去

    json 复制代码
    {
        "posts": [
          { "id": "1", "title": "a title", "views": 100 },
          { "id": "2", "title": "another title", "views": 200 }
        ],
        "comments": [
          { "id": "1", "text": "a comment about post 1", "postId": "1" },
          { "id": "2", "text": "another comment about post 1", "postId": "1" }
        ],
        "profile": {
          "name": "typicode"
        }
      }
  3. 在文件夹下终端中输入命令

    复制代码
    json-server --watch db.json

    注意版本不同命令可能会有差异,这里的命令是上面版本的json-server的。这样就启动完成了。

  4. 终端会输出三个地址,分别用于访问不同的数据,文档中还有更多的路径对应不同的需求。

axios的介绍与页面配置

https://www.axios-http.cn/docs/intro

  1. axios是基于promise的http客户端,可以在浏览器和nodejs两个环境中运行。浏览器端可以借助axios发送AJAX请求,可以在nodejs中运行向外发送http请求。

  2. 可以通过npm或yarn下载,也可以引入script标签

    扩:

    Bootstrap 是一个前端框架,用于开发响应式 Web 项目,包含 CSS 和 JavaScript 组件。

    BootCDN 是一个 CDN 服务平台,提供快速、稳定的前端库和框架的 CDN 链接,包括但不限于 Bootstrap。

  3. 请求配置:

    js 复制代码
    这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 GET 方法。
    
    {
      // `url` 是用于请求的服务器 URL
      url: '/user',
    
      // `method` 是创建请求时使用的方法
      method: 'get', // 默认值
    
      // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
      // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
      baseURL: 'https://some-domain.com/api/',
    
      // `transformRequest` 允许在向服务器发送前,修改请求数据
      // 它只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
      // 数组中最后一个函数必须返回一个字符串, 一个Buffer实例,ArrayBuffer,FormData,或 Stream
      // 你可以修改请求头。
      transformRequest: [function (data, headers) {
        // 对发送的 data 进行任意转换处理
    
        return data;
      }],
    
      // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
      transformResponse: [function (data) {
        // 对接收的 data 进行任意转换处理
    
        return data;
      }],
    
      // 自定义请求头
      headers: {'X-Requested-With': 'XMLHttpRequest'},
    
      // `params` 是与请求一起发送的 URL 参数
      // 必须是一个简单对象或 URLSearchParams 对象
      params: {
        ID: 12345
      },
    
      // `paramsSerializer`是可选方法,主要用于序列化`params`
      // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
      paramsSerializer: function (params) {
        return Qs.stringify(params, {arrayFormat: 'brackets'})
      },
    
      // `data` 是作为请求体被发送的数据
      // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
      // 在没有设置 `transformRequest` 时,则必须是以下类型之一:
      // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
      // - 浏览器专属: FormData, File, Blob
      // - Node 专属: Stream, Buffer
      data: {
        firstName: 'Fred'
      },
      
      // 发送请求体数据的可选语法
      // 请求方式 post
      // 只有 value 会被发送,key 则不会
      data: 'Country=Brasil&City=Belo Horizonte',
    
      // `timeout` 指定请求超时的毫秒数。
      // 如果请求时间超过 `timeout` 的值,则请求会被中断
      timeout: 1000, // 默认值是 `0` (永不超时)
    
      // `withCredentials` 表示跨域请求时是否需要使用凭证
      withCredentials: false, // default
    
      // `adapter` 允许自定义处理请求,这使测试更加容易。
      // 返回一个 promise 并提供一个有效的响应 (参见 lib/adapters/README.md)。
      adapter: function (config) {
        /* ... */
      },
    
      // `auth` HTTP Basic Auth
      auth: {
        username: 'janedoe',
        password: 's00pers3cret'
      },
    
      // `responseType` 表示浏览器将要响应的数据类型
      // 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
      // 浏览器专属:'blob'
      responseType: 'json', // 默认值
    
      // `responseEncoding` 表示用于解码响应的编码 (Node.js 专属)
      // 注意:忽略 `responseType` 的值为 'stream',或者是客户端请求
      // Note: Ignored for `responseType` of 'stream' or client-side requests
      responseEncoding: 'utf8', // 默认值
    
      // `xsrfCookieName` 是 xsrf token 的值,被用作 cookie 的名称
      xsrfCookieName: 'XSRF-TOKEN', // 默认值
    
      // `xsrfHeaderName` 是带有 xsrf token 值的http 请求头名称
      xsrfHeaderName: 'X-XSRF-TOKEN', // 默认值
    
      // `onUploadProgress` 允许为上传处理进度事件
      // 浏览器专属
      onUploadProgress: function (progressEvent) {
        // 处理原生进度事件
      },
    
      // `onDownloadProgress` 允许为下载处理进度事件
      // 浏览器专属
      onDownloadProgress: function (progressEvent) {
        // 处理原生进度事件
      },
    
      // `maxContentLength` 定义了node.js中允许的HTTP响应内容的最大字节数
      maxContentLength: 2000,
    
      // `maxBodyLength`(仅Node)定义允许的http请求内容的最大字节数
      maxBodyLength: 2000,
    
      // `validateStatus` 定义了对于给定的 HTTP状态码是 resolve 还是 reject promise。
      // 如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),
      // 则promise 将会 resolved,否则是 rejected。
      validateStatus: function (status) {
        return status >= 200 && status < 300; // 默认值
      },
    
      // `maxRedirects` 定义了在node.js中要遵循的最大重定向数。
      // 如果设置为0,则不会进行重定向
      maxRedirects: 5, // 默认值
    
      // `socketPath` 定义了在node.js中使用的UNIX套接字。
      // e.g. '/var/run/docker.sock' 发送请求到 docker 守护进程。
      // 只能指定 `socketPath` 或 `proxy` 。
      // 若都指定,这使用 `socketPath` 。
      socketPath: null, // default
    
      // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
      // and https requests, respectively, in node.js. This allows options to be added like
      // `keepAlive` that are not enabled by default.
      httpAgent: new http.Agent({ keepAlive: true }),
      httpsAgent: new https.Agent({ keepAlive: true }),
    
      // `proxy` 定义了代理服务器的主机名,端口和协议。
      // 您可以使用常规的`http_proxy` 和 `https_proxy` 环境变量。
      // 使用 `false` 可以禁用代理功能,同时环境变量也会被忽略。
      // `auth`表示应使用HTTP Basic auth连接到代理,并且提供凭据。
      // 这将设置一个 `Proxy-Authorization` 请求头,它会覆盖 `headers` 中已存在的自定义 `Proxy-Authorization` 请求头。
      // 如果代理服务器使用 HTTPS,则必须设置 protocol 为`https`
      proxy: {
        protocol: 'https',
        host: '127.0.0.1',
        port: 9000,
        auth: {
          username: 'mikeymike',
          password: 'rapunz3l'
        }
      },
    
      // see https://axios-http.com/zh/docs/cancellation
      cancelToken: new CancelToken(function (cancel) {
      }),
    
      // `decompress` indicates whether or not the response body should be decompressed 
      // automatically. If set to `true` will also remove the 'content-encoding' header 
      // from the responses objects of all decompressed responses
      // - Node only (XHR cannot turn off decompression)
      decompress: true // 默认值
    
    }
  4. 响应结构:

    一个请求的响应包含以下信息。

    js 复制代码
    {
      // `data` 由服务器提供的响应
      data: {},
    
      // `status` 来自服务器响应的 HTTP 状态码
      status: 200,
    
      // `statusText` 来自服务器响应的 HTTP 状态信息
      statusText: 'OK',
    
      // `headers` 是服务器响应头
      // 所有的 header 名称都是小写,而且可以使用方括号语法访问
      // 例如: `response.headers['content-type']`
      headers: {},
    
      // `config` 是 `axios` 请求的配置信息
      config: {},
    
      // `request` 是生成此响应的请求
      // 在node.js中它是最后一个ClientRequest实例 (in redirects),
      // 在浏览器中则是 XMLHttpRequest 实例
      request: {}
    }

    当使用 then 时,您将接收如下响应:

    js 复制代码
    axios.get('/user/12345')
      .then(function (response) {
        console.log(response.data);
        console.log(response.status);
        console.log(response.statusText);
        console.log(response.headers);
        console.log(response.config);
      });

    当使用 catch,或者传递一个rejection callback作为 then 的第二个参数时,响应可以通过 error 对象被使用,正如在错误处理部分解释的那样。

  5. 默认配置:

    您可以指定默认配置,它将作用于每个请求。

    全局 axios 默认值

    js 复制代码
    axios.defaults.baseURL = 'https://api.example.com';
    axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

    自定义实例默认值

    js 复制代码
    // 创建实例时配置默认值
    const instance = axios.create({
      baseURL: 'https://api.example.com'
    });
    
    // 创建实例后修改默认值
    instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

    配置的优先级

    配置将会按优先级进行合并。它的顺序是:在lib/defaults.js中找到的库默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后面的优先级要高于前面的。下面有一个例子。

    js 复制代码
    // 使用库提供的默认配置创建实例
    // 此时超时配置的默认值是 `0`
    const instance = axios.create();
    
    // 重写库的超时默认值
    // 现在,所有使用此实例的请求都将等待2.5秒,然后才会超时
    instance.defaults.timeout = 2500;
    
    // 重写此请求的超时时间,因为该请求需要很长时间
    instance.get('/longRequest', {
      timeout: 5000
    });
  6. 拦截器

    在拦截器中config是发出请求的配置对象,可以通过修改config来修改发出的请求。

    js 复制代码
    //设置请求拦截器 config 配置对象
            axios.interceptors.request.use(function(config){
                console.log("请求拦截器 success--1号");
                //修改config中的参数
                config.params={a:100};
                return config;
                // throw "抛出失败,返回失败的promise"
            },function(error){
                console.log("请求拦截器 fail--1号");
                return Promise.reject(error);
            })
    
            //设置请求拦截器
            axios.interceptors.request.use(function(config){
                console.log("请求拦截器 success--2号");
                //修改 config中的参数
                config.timeout=2000;
                return config;
                // throw "抛出失败,返回失败的promise"
            },function(error){
                console.log("请求拦截器 fail--2号");
                return Promise.reject(error);
            })

    而response是axios默认创建的响应结果,响应拦截器可以不返回整个响应结果,而是返回响应结果的一部分。

    js 复制代码
    //设置响应拦截器
            axios.interceptors.response.use(function(response){
                console.log("响应拦截器 成功--1号");
                return response.data;//只返回data
            },function(error){
                console.log("响应拦截器 失败--1号");
                return Promise.reject(error);
            })

    在请求或响应被 then 或 catch 处理前拦截它们。

    js 复制代码
    // 添加请求拦截器
    axios.interceptors.request.use(function (config) {
        // 在发送请求之前做些什么
        return config;
      }, function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
      });
    
    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么
        return response;
      }, function (error) {
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        return Promise.reject(error);
      });

    如果你稍后需要移除拦截器,可以这样:

    js 复制代码
    const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
    axios.interceptors.request.eject(myInterceptor);

    可以给自定义的 axios 实例添加拦截器。

    js 复制代码
    const instance = axios.create();
    instance.interceptors.request.use(function () {/*...*/});
  7. 错误处理

    js 复制代码
    axios.get('/user/12345')
      .catch(function (error) {
        if (error.response) {
          // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
          console.log(error.response.data);
          console.log(error.response.status);
          console.log(error.response.headers);
        } else if (error.request) {
          // 请求已经成功发起,但没有收到响应
          // `error.request` 在浏览器中是 XMLHttpRequest 的实例,
          // 而在node.js中是 http.ClientRequest 的实例
          console.log(error.request);
        } else {
          // 发送请求时出了点问题
          console.log('Error', error.message);
        }
        console.log(error.config);
      });

    使用 validateStatus 配置选项,可以自定义抛出错误的 HTTP code。

    js 复制代码
    axios.get('/user/12345', {
      validateStatus: function (status) {
        return status < 500; // 处理状态码小于500的情况
      }
    })

    使用 toJSON 可以获取更多关于HTTP错误的信息。

    js 复制代码
    axios.get('/user/12345')
      .catch(function (error) {
        console.log(error.toJSON());
      });
  8. 创建一个实例 使用自定义配置新建一个实例。

axios.create([config])
js 复制代码
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});
  1. 取消请求

    使用 Axios 取消请求涉及几个关键步骤:创建取消令牌,发送请求时附带该取消令牌,调用取消函数来取消请求,以及处理取消请求后的响应。

    具体的执行步骤:

    1. 创建取消令牌

    使用 axios.CancelToken.source() 创建一个取消令牌源,该源对象包含 tokencancel 两个属性:

    • token 用于传递给请求配置以支持取消操作。
    • cancel 是一个函数,可以调用该函数来取消请求。
    javascript 复制代码
    const cancelTokenSource = axios.CancelToken.source();

    2. 发送请求并附带取消令牌

    在发送请求时,将创建的取消令牌附加到请求配置中:

    javascript 复制代码
    axios.get('http://localhost:3000/posts', {
      cancelToken: cancelTokenSource.token
    })
    .then(response => {
      console.log(response.data);
    })
    .catch(error => {
      if (axios.isCancel(error)) {
        console.log('Request canceled:', error.message);
      } else {
        console.error('Request failed:', error);
      }
    });

    3. 取消请求

    在需要取消请求时,调用取消令牌源的 cancel 函数。可以在某个按钮的点击事件或其他触发条件下执行此操作:

    javascript 复制代码
    cancelTokenSource.cancel('Request canceled by user.');

    4. 处理取消请求后的响应

    在请求的 .catch 方法中处理取消错误,使用 axios.isCancel(error) 来判断是否由于取消操作引起的错误:

    javascript 复制代码
    .catch(error => {
      if (axios.isCancel(error)) {
        console.log('Request canceled:', error.message);
      } else {
        console.error('Request failed:', error);
      }
    });

    完整代码:

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Axios Cancel Request Example</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.7.2/axios.min.js"></script>
        <!-- CSS -->
        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.2/css/bootstrap.min.css" rel="stylesheet"
            integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <h2 class="page-header">axios取消请求</h2>
            <button class="btn btn-primary" id="send-request">发送请求</button>
            <button class="btn btn-warning" id="cancel-request">取消请求</button>
        </div>
        <script>
            let cancelTokenSource;
    
            document.getElementById('send-request').onclick = function() {
                // 如果之前有未完成的请求,则取消它
                if (cancelTokenSource) {
                    cancelTokenSource.cancel('Operation canceled by the user.');
                }
    
                // 创建新的取消令牌
                cancelTokenSource = axios.CancelToken.source();
    
                axios.get('http://localhost:3000/posts', {
                    cancelToken: cancelTokenSource.token
                })
                .then(response => {
                    console.log(response.data);
                    cancelTokenSource = null; // 请求完成后清除取消令牌
                })
                .catch(error => {
                    if (axios.isCancel(error)) {
                        console.log('Request canceled:', error.message);
                    } else {
                        console.error('Request failed:', error);
                    }
                    cancelTokenSource = null; // 请求失败后清除取消令牌
                });
            };
    
            document.getElementById('cancel-request').onclick = function() {
                if (cancelTokenSource) {
                    cancelTokenSource.cancel('Request canceled by user.');
                    console.log('请求已取消');
                } else {
                    console.log('没有正在进行的请求');
                }
            };
        </script>
    </body>
    </html>

    步骤总结

    1. 创建取消令牌 :使用 axios.CancelToken.source() 创建。
    2. 发送请求并附带取消令牌 :将 cancelTokenSource.token 添加到请求配置中。
    3. 取消请求 :调用 cancelTokenSource.cancel('取消原因')
    4. 处理取消后的响应 :在 .catch 方法中使用 axios.isCancel(error) 判断是否为取消请求导致的错误。
相关推荐
xzboss8 分钟前
DOM转矢量PDF
前端·javascript
一无所有不好吗8 分钟前
纯前端vue项目实现版本更新(纯代码教程)
前端
小小星球之旅9 分钟前
redis缓存常见问题
数据库·redis·学习·缓存
Haoea!10 分钟前
Flink03-学习-套接字分词流自动写入工具
开发语言·学习
哆啦A梦的口袋呀21 分钟前
基于Python学习《Head First设计模式》第三章 装饰者模式
python·学习·设计模式
安全系统学习22 分钟前
内网横向之RDP缓存利用
前端·安全·web安全·网络安全·中间件
哆啦A梦的口袋呀22 分钟前
基于Python学习《Head First设计模式》第五章 单件模式
python·学习·设计模式
Hilaku29 分钟前
为什么我不再相信 Tailwind?三个月重构项目教会我的事
前端·css·前端框架
love530love30 分钟前
【笔记】Windows 下载并安装 ChromeDriver
人工智能·windows·笔记·python·深度学习
FogLetter30 分钟前
JavaScript 的历史:从网页点缀到改变世界的编程语言
前端·javascript·http