• Fetch与Axios数据请求


    Polyfill简介

    Polyfill是一个js库,主要抚平不同浏览器之间对js实现的差异。比如,html5storage(session,local), 不同浏览器,不同版本,有些支持,有些不支持。PolyfillPolyfill有很多,在GitHubhttps://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills),帮你把这些差异化抹平,不支持的变得支持了(典型做法是在IE浏览器中增加 window.XMLHttpRequest ,内部实现使用 ActiveXObject。)

    提到Polyfill,不得不提shim。        polyfillshim的一种。
    shim是将不同 api封装成一种,比如 jQuery$.ajax 封装了 XMLHttpRequestIEActiveXObject方式创建xhr对象。它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现。

    Fetch异步请求

    Fetch介绍

    XMLHttpRequest是一个设计粗糙的API,配置和调用方式非常混乱,而且基于事件的异步模型,写起来不友好,容易掉入回调地狱中。

    W3C新标准出来后,给了我们一个新的通道Fetch,Fetch取代了XMLHttpRequest,它是集成在浏览器标准里面的,所以它就是嫡系,它虽然是嫡系,但是它的兼容性不是很好,也没有第三方库:axios好用,所以用它比较少

    (局部页面刷新技术没有改变,只是说一前做异步的时候用XMLHttpRequest来实现,现在我们可以用Fetch来实现,Fetch是基于polyfill的)

    Fetch是浏览器自带的,无需再次引入其他的插件包了。

    Fetch异步请求案列

    1. //Get请求
    2. fetch("http://localhost:8080/users")
    3. .then(res => res.json()) //这里和获取到的不是返回值,只是设定返回的数据类型,如果服务端返回的是Json那么这里就res.json(),如果服务端返回的是文本,那么这里就res.text()
    4. .then(res => {
    5. console.log(res); //这里才是返回具体数据
    6. })
    7. //Post请求
    8. fetch("http://localhost:8080/users", { method: 'post', headers: { "content-type": "application/json", body: JSON.stringify({ username: "张三", age: 18 }) } })
    9. .then(res => res.json()) //这里和获取到的不是返回值,只是设定返回的数据类型,如果服务端返回的是Json那么这里就res.json(),如果服务端返回的是文本,那么这里就res.text()
    10. .then(res => {
    11. console.log(res); //这里才是返回具体数据
    12. })
    13. //Post请求
    14. fetch("http://localhost:8080/users", { method: 'post', headers: { "content-type": "application/x-www-formurlencoded", body: "name=王五&age=20" } })
    15. .then(res => res.json()) //这里和获取到的不是返回值,只是设定返回的数据类型,如果服务端返回的是Json那么这里就res.json(),如果服务端返回的是文本,那么这里就res.text()
    16. .then(res => {
    17. console.log(res); //这里才是返回具体数据
    18. })
    19. //Put请求
    20. fetch("http://localhost:8080/users", { method: 'put', headers: { "content-type": "application/json", body: JSON.stringify({ username: "张三", age: 18 }) } })
    21. .then(res => res.json()) //这里和获取到的不是返回值,只是设定返回的数据类型,如果服务端返回的是Json那么这里就res.json(),如果服务端返回的是文本,那么这里就res.text()
    22. .then(res => {
    23. console.log(res); //这里才是返回具体数据
    24. })
    25. //Delete请求
    26. fetch("http://localhost:8080/users/5", { method: 'post', headers: { "content-type": "application/json", body: JSON.stringify({ username: "张三", age: 19 }) } })
    27. .then(res => res.json()) //这里和获取到的不是返回值,只是设定返回的数据类型,如果服务端返回的是Json那么这里就res.json(),如果服务端返回的是文本,那么这里就res.text()
    28. .then(res => {
    29. console.log(res); //这里才是返回具体数据
    30. })

    axios异步请求

    axios:因为axios是第三方库,所以需要引入包

    参考文档:axios介绍与使用说明 axios中文文档-腾讯云开发者社区-腾讯云 (tencent.com)

    npm install axios   #安装axios包

     axios异步请求案列

    1. //完整写法
    2. //你可以根据你的需求选择不同的 responseType 类型,以便更好地处理响应数据。
    3. //responseType:'json':会自动解析响应数据并返回一个 JavaScript 对象。它为默认值。
    4. //responseType:'arraybuffer':返回一个 ArrayBuffer 对象,适用于处理二进制数据。
    5. //responseType:'blob' :返回一个 Blob 对象,适用于处理图像等二进制数据。
    6. //responseType:'document' :返回一个 Document 对象,适用于处理 HTML/XML 数据。
    7. //responseType:'text':返回一个字符串,适用于处理纯文本数据。
    8. //responseType:'stream':返回一个stream。
    9. axios({
    10. baseURL: "http://localhost:8080",// baseURL 将自动加在 url 前面,除非 url 是一个绝对 URL。
    11. method: 'post', //get,post,put,delete
    12. url: '/users',
    13. responseType: 'stream',//响应类型:
    14. timeout: 1000, // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)如果请求话费了超过 `timeout` 的时间,请求将被中断
    15. withCredentials: false, // 表示跨域请求时是否需要使用凭证,默认为false:
    16. maxContentLength: 2000, // 定义允许的响应内容的最大尺寸,
    17. headers: { "X-Requested-With": "XMLHttpRequest" }, //即将被发送的自定义请求头
    18. // transformRequest 允许在向服务器发送前,修改请求数据
    19. // 只能用在 "PUT", "POST" 和 "PATCH" 这几个请求方法
    20. // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
    21. transformRequest: [function (data) {
    22. // 对 data 进行任意转换处理
    23. return data;
    24. }],
    25. //transformResponse表示:在传递给 then/catch 前,允许修改响应数据
    26. transformResponse: [function (data) {
    27. //对 data 进行任意转换处理
    28. return data;
    29. }],
    30. // params 是即将与请求一起发送的 URL 参数
    31. // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
    32. params: {
    33. ID: 12345
    34. },
    35. // data 是作为请求主体被发送的数据
    36. // 只适用于这些请求方法 "PUT", "POST", 和 "PATCH"
    37. // 在没有设置 `transformRequest` 时,必须是以下类型之一:
    38. // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
    39. // - 浏览器专属:FormData, File, Blob
    40. // - Node 专属: Stream
    41. data: {
    42. name: '黎明',
    43. age: 25
    44. },
    45. // auth 表示应该使用 HTTP 基础验证,并提供凭据
    46. // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
    47. auth: {
    48. username: "janedoe",
    49. password: "s00pers3cret"
    50. },
    51. // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
    52. xsrfCookieName: "XSRF-TOKEN", // default
    53. // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
    54. xsrfHeaderName: "X-XSRF-TOKEN", // 默认的
    55. // `onUploadProgress` 允许为上传处理进度事件
    56. onUploadProgress: function (progressEvent) {
    57. // 对原生进度事件的处理
    58. },
    59. // `onDownloadProgress` 允许为下载处理进度事件
    60. onDownloadProgress: function (progressEvent) {
    61. // 对原生进度事件的处理
    62. },
    63. // `maxContentLength` 定义允许的响应内容的最大尺寸
    64. maxContentLength: 2000,
    65. // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
    66. validateStatus: function (status) {
    67. return status >= 200 & status < 300; // 默认的
    68. },
    69. // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
    70. // 如果设置为0,将不会 follow 任何重定向
    71. maxRedirects: 5, // 默认的
    72. // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
    73. // `keepAlive` 默认没有启用
    74. httpAgent: new http.Agent({ keepAlive: true }),
    75. httpsAgent: new https.Agent({ keepAlive: true }),
    76. // "proxy" 定义代理服务器的主机名称和端口
    77. // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
    78. // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
    79. proxy: {
    80. host: "127.0.0.1",
    81. port: 9000,
    82. auth: {
    83. username: "mikeymike",
    84. password: "rapunz3l"
    85. }
    86. },
    87. // `cancelToken` 指定用于取消请求的 cancel token
    88. // (查看后面的 Cancellation 这节了解更多)
    89. cancelToken: new CancelToken(function (cancel) {
    90. })
    91. }).then(res => console.log(res.data)).catch(err => console.log(err));
    92. //简写
    93. axios.get("http://localhost:8080/users")
    94. .then(res => console.log(res.data))
    95. .catch(err => console.log(err));
    96. axios.get("http://localhost:8080/users", { params: { name: "张三" } })
    97. .then(res => console.log(res.data))
    98. .catch(err => console.log(err));
    99. // post-json
    100. axios.post("http://localhost:8080/users", { name: "张三", age: 21 })
    101. .then(res => console.log(res.data))
    102. .catch(err => console.log(err));
    103. // post-form
    104. axios.post("http://localhost:8080/users", "name=张三&age=21")
    105. .then(res => console.log(res.data))
    106. .catch(err => console.log(err));
    107. axios.post("http://localhost:8080/users/5", { name: "张三", age: 21 })
    108. .then(res => console.log(res.data))
    109. .catch(err => console.log(err));
    110. axios.delete("http://localhost:8080/users/5")
    111. .then(res => console.log(res.data))
    112. .catch(err => console.log(err));

    axios请求响应结构

    axios请求的响应包含以下信息:

    1. {
    2. // `data` 由服务器提供的响应
    3. data: {},
    4. // `status` HTTP 状态码
    5. status: 200,
    6. // `statusText` 来自服务器响应的 HTTP 状态信息
    7. statusText: "OK",
    8. // `headers` 服务器响应的头
    9. headers: {},
    10. // `config` 是为请求提供的配置信息
    11. config: {}
    12. }

    axios请求的响应包含以下信息:

    1. axios.get("/user/12345")
    2. .then(function(response) {
    3. console.log(response.data);
    4. console.log(response.status);
    5. console.log(response.statusText);
    6. console.log(response.headers);
    7. console.log(response.config);
    8. });

    Axios封装

    自定义的一个axios.js文件

    1. import axios from 'axios'
    2. import globalconfig from '../config/axios.global.config.js'
    3. import md5 from 'md5' //需要安装 npm i --save md5
    4. import router from '../router/index.js';
    5. // 自定义配置创建一个 axios 实例
    6. const rquest = axios.create({
    7. // baseURL: "http://localhost:8000",
    8. timeout: 30 * 1000,
    9. responseType: "json",
    10. // headers: {
    11. // "a": "123"
    12. // }
    13. })
    14. // 添加请求拦截器
    15. rquest.interceptors.request.use(
    16. function (config) {
    17. // 在发送请求之前做些什么
    18. let whiteList = globalconfig.whiteListApi;
    19. let url = config.url;
    20. let token = localStorage.getItem("token");
    21. //如果请求的路径不再白名单中,但是已经登陆了
    22. if (whiteList.indexOf(url) === -1 && token) {
    23. //将token加到请求头中
    24. config.headers.token = token;
    25. }
    26. //秘钥:secretId+MD5算法:token一般存在localStorage中,比较显性,token容易泄露,拿到token可以伪造请求,获得数据,为防止这种情况我们可以再加一个秘钥,这个秘钥相当于加盐算法中的盐
    27. let _secret = md5(globalconfig.secretId)
    28. config.headers.secret = _secret;
    29. return config;
    30. },
    31. function (error) {
    32. // 对请求错误做些什么
    33. return Promise.reject(error);
    34. }
    35. );
    36. // 添加响应拦截器
    37. rquest.interceptors.response.use(
    38. function (response) {
    39. // 对响应数据做点什么
    40. //统一响应处理:
    41. const status = response.data.cocde || 200 //如果后台没有返回code,则统一返回200
    42. const message = response.data.msg || "未知错误" //如果后台没用返回msg,则统一返回未知错误
    43. if (status === 401) {
    44. // alert("您没有权限访问");
    45. // router.push("/Login")
    46. return Promise.reject(new Error(message));
    47. } else if (status !== 200) {
    48. alert("错误码:" + status + " " + message)
    49. return Promise.reject(new Error(message));
    50. }
    51. return response;
    52. },
    53. function (error) {
    54. // 对响应错误做点什么
    55. return Promise.reject(error);
    56. }
    57. );
    58. export default rquest

    axios.global.config.js

    1. export default{
    2. //白名单:不需要验证Token的页面
    3. whiteListApi:['/a','/b'],
    4. secretId:"helloword" //这个秘钥相当于加盐算法中的盐
    5. }

  • 相关阅读:
    pytorch-textsummary,中文文本摘要实践
    1039 到底买不买
    基于Leaflet的leaflet-sidebar侧边栏组件集成
    【2205.05740v2】Surface Representation for Point Clouds
    数字经济时代 企业的数据安全需要多维考虑
    【大数据】大数据组件TiDB原理+实战篇
    NOIP2023游记
    ✨✨✨if __name__ == “__main__“ 在 Python 中意味着什么?
    springboot+jsp+ssm手办周边商城购物网站306
    十分钟搞懂基-2 FFT原理及编程思想
  • 原文地址:https://blog.csdn.net/Fanbin168/article/details/133843246