Web前端系列之axios框架应用解析

内容提要

  1. axios框架概述
  2. 在Vue-cli中使用axios
  3. 在Vue-cli中实现跨域访问
  4. axios API
  5. 请求配置参考

一、axios框架概述

在Web前端实际开发中,我们都使用一些封装好的ajax框架,实现快捷高效的开发。
优秀的ajax框架很多,这里我们选用axios框架。原因是Vue官方推荐使用的就是axios框架。
axios框架中文官网:axios中文网|axios API 中文文档 | axios

1.1 get方式与post方式请求

在学习axios之前,首先要知道:http请求方式有两种:get方式、post方式。

  1. get方式:显式提交。
    将表单内容经过编码之后 ,通过URL发送, 即将提交参数写在URL地址的后面。
    使用get方式发送时有字符长度的限制(因为get方式请求的参数是放在请求头中的),不安全。
  2. post方式:隐式提交。
    将表单的内容通过http发送,即不将提交参数写在URL地址的后面,而是封装在请求体中。
    post没有字符长度的限制,安全。(因为post方式请求的参数是放在请求体中的)

注意:

(1)在早期的、前后端不分离的开发模式中,大量使用表单提交、超链接提交等。那么、表单提交、超链接提交默认都是get方式。只有在表单中明确设置 method="post" 时,才是post提交、

(2)现在的前后端分离开发模式中,已经不再使用表单提交、超链接提交等,而都是使用 ajax 提交。

1.2 axios的get方式请求

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
    //get方式请求,请求参数直接写在url的后面
	axios.get('http://api.tianapi.com/txapi/ncovcity/index?key=自己的key')
		.then(function(response) {
			console.log(response);
		})
		.catch(function(error) {
			console.log(error);
		});
</script>

1.3 axios的post方式请求

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
	//将json数据转成URI编码,并解析为xxx=xxx&xxx=xxx形式
	function transformRequest(data) {
		let ret = '';
		for (let it in data) {
			ret += encodeURIComponent(it)+'='+encodeURIComponent(data[it])+'&';
		}
		return ret;
	}
    
	//post方式请求,请求参数不写在url的后面(需要将json对象参数转码,服务器端才能识别)
	axios.post('http://api.tianapi.com/txapi/ncovcity/index', transformRequest({
		key: '自己的key'
	}))
		.then(function(response) {
			console.log(response);
		})
		.catch(function(error) {
			console.log(error);
		});
</script>

1.4 axios响应数据结构

axios响应的数据结构是一个json对象,此json对象结构如下:

{
  // `data` 由服务器提供的响应
  data: {},
  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,
    // `statusText` 来自服务器响应的 HTTP 状态信息
    statusText: 'OK',
    // `headers` 服务器响应的头
    headers: {},
  // `config` 是为请求提供的配置信息
  config: {},
  // 'request' 请求信息
  request: {}
}

1.5 axios的全局配置

可以在全局配置axios的一些属性,那么这些配置就将被用在各个请求中。

比如:在App.vue组件文件配置

<script setup>
	import {
		provide
	} from "vue";
	//导入vue的ajax对象,实现异步请求功能
	import axios from 'axios';
	//全局设置axios的基础url部分,如果部署到centos这里localhost要修改为ip地址
	axios.defaults.baseURL = 'http://localhost:5090/';
	//以键-值对方式,设置一个全局缓存对象,其它组件通过inject()方法导入
	provide('axios', axios);
</script>

1.6 axios拦截器

我们还可以在请求或响应之前,拦截请求和响应。

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
	//请求拦截器
	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.get('http://api.tianapi.com/txapi/ncovcity/index?key=自己的key')
		.then(function(response) {
			console.log(response);
		})
		.catch(function(error) {
			console.log(error);
		});
</script>

注意:修改请求url使之成为一个错误的url,运行后,会触发拦截 “请求之前” 和 “响应错误” 。

二、在Vue-cli中使用axios

1、添加axios模块:

cd hello
npm install axios --save

2、 添加成功后,在package.json文件中就可以看到:

  "dependencies": {
    "axios": "^1.7.7",
    "echarts": "^5.5.1",
    "element-plus": "^2.8.3",
    "font-awesome": "^4.7.0",
    "qs": "^6.13.0",
    "unplugin-auto-import": "^0.18.3",
    "unplugin-vue-components": "^0.27.4",
    "vue": "^3.3.4",
    "vue-router": "^4.4.5"
  }

3、在vue文件中书写代码:

声明注册方法
const reg = () => {
  //post(后端接口,传后端数据),then(回调函数),catch()
  //axios.post(url,{}).then(()=>{}).catch(()=>{})
  let us = username.value; //获取响应对象值
  let pa = password.value;
  //将js对象通过qs转json字符串
  let user = qs.stringify({
    username: us,
    password: pa
  });
  //通用请求
  axios({
    url: "user/reg",
    method: "post",
    data: user //post请求需要传一个json字符串
  }).then((res) => { //请求成功
    msg.value = res.data.message;
  }).catch((er) => { //系统出错
    console.log(er.data);
  })

三、在Vue-cli中实现跨域访问

3.1 什么是跨域访问

3.1.1 同源策略

同源策略,它是由Netscape提出的一个著名的安全策略。它是浏览器最核心也最基本的安全策略。
网络协议、服务器的IP地址、端口都相同,即为同源。否则,上面三个中有一个不同,即为不同源。

3.1.2 跨域访问

当一个客户端访问服务器端时,如果客户端的协议、IP、端口三者之间的任一个,与服务器端的协议、IP、端口不同时,即为跨域访问。

注意:为了安全,AJAX默认不允许跨域访问

<script setup>
import axios from "axios";

axios
  .get(
    "http://v.juhe.cn/toutiao/index?type=top&key=自己的KEY"
  )
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.log(error);
  });
</script>

运行上面代码,在浏览器控制台中会出现 “跨域访问” 错误。

Access-Control-Allow-Origin 访问控制允许源。

3.1.3 解决AJAX跨域问题

我们现在的开发模式是前后端分离,也就是前端是一个工程,部署在客户端机器上; 而服务器端是另一个工程,部署在服务器机器上。这就必然要进行跨域访问。但是,AJAX默认不允许跨域访问,如何解决呢?

通常有两种解决方案:

(1)服务器端设置允许跨域访问; 比如:CORS(跨域资源共享)代理方式

(2)前端通过代理进行跨域访问;比如:Vue-cli自带的跨域代理方式

注意:

  1. 上面案例中,天行数据接口的服务器端就允许跨域访问。而聚合数据接口的服务器,就不允许跨域访问。
  2. 这里我们使用Vue-cli给我们提供的代理方式实现跨越访问;
  3. 在服务器端课程中,我们还要学习CORS方式实现服务器端允许跨域访问。

3.2 使用Vue-cli实现跨域访问

1、在Vue-cli配置文件中书写代理跨域配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {
      '/juheNews': {
        target: 'http://v.juhe.cn/toutiao/index',    //需要跨域的url
        ws: true,                                    //代理webSocket
        changeOrigin: true,                          //允许跨域
        pathRewrite: {
          '^/juheNews': ''                         //重写路径
        }
      }
    }
  }
})
  • 我们知道同源策略只是在浏览器中存在,不存在于服务器中。
  • 因此我们可以将需要跨域请求的地址转发给Vue-cli自带服务器,然后委托服务器去请求信息。(常见的有node代理、nginx转发等。)

2、重启VueCli后,在vue组件中进行访问:

<script setup>
  import axios from "axios";

axios
  .get(
    "/juheNews?type=top&key=自己的KEY"
  )
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.log(error);
  });
</script>

注意:访问时使用代理url:/juheNews?type=top&key=自己的key

四、axios API

也可以通过向 axios 传递相关配置来创建请求。

格式:axios(配置);

// 发送 post 请求
axios({
  method: 'post',
  url: 'http://localhost:5090/user/register',
  // `data` 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  data: {
    key: '自己的key'
  }
}).then((res)=>{
    let data=res.data.data; 
}).catch((err)=>{
    console.log(err);
})
// 发送 get 请求
axios({
  method:'get',
  url:'http://localhost:5090/user/login',
  // `params` 是即将与请求一起发送的 URL 参数
  params: {
    key: '自己的key'
  }
})
  .then((res)=>{
    let data=res.data.data;
}).catch((err)=>{
    console.log(err);
})

五、请求配置参考

以下是创建请求时可以用的配置选项,只有 url 是必需的。

如果没有指定 method,请求将默认使用 get 方法。

{
  // `url` 是用于请求的服务器 URL
  url: '/user',

    // `method` 是创建请求时使用的方法
    method: 'get', // default

    // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    baseURL: 'https://some-domain.com/api/',

    // `transformRequest` 允许在向服务器发送前,修改请求数据
    // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
    // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
    transformRequest: [function (data, headers) {
    // 对 data 进行任意转换处理
    return data;
  }],

    // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
    transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    return data;
  }],

    // `headers` 是即将被发送的自定义请求头
    headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是即将与请求一起发送的 URL 参数
  // 必须是一个无格式对象(plain object)或 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', 和 'PATCH'
  // 在没有设置 `transformRequest` 时,必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属:FormData, File, Blob
  // - Node 专属: Stream
  data: {
    firstName: 'Fred'
  },

  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断
  timeout: 1000,

    // `withCredentials` 表示跨域请求时是否需要使用凭证
    withCredentials: false, // default

    // `adapter` 允许自定义处理请求,以使测试更轻松
    // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).
    adapter: function (config) {
    /* ... */
  },
  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据
  // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
  auth: {
    username: 'janedoe',
      password: 's00pers3cret'
  },

  // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json', // default

    // `responseEncoding` indicates encoding to use for decoding responses
    // Note: Ignored for `responseType` of 'stream' or client-side requests
    responseEncoding: 'utf8', // default

    // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
    xsrfCookieName: 'XSRF-TOKEN', // default

    // `xsrfHeaderName` is the name of the http header that carries the xsrf token value
    xsrfHeaderName: 'X-XSRF-TOKEN', // default
    // `onUploadProgress` 允许为上传处理进度事件
    onUploadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },

  // `onDownloadProgress` 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `maxContentLength` 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

    // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。    
    //如果`validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 
    //否则,promise 将被 reject
    validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },
  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
  // 如果设置为0,将不会 follow 任何重定向
  maxRedirects: 5, // default

  // `socketPath` defines a UNIX Socket to be used in node.js.
  // e.g. '/var/run/docker.sock' to send requests to the docker daemon.
  // Only either `socketPath` or `proxy` can be specified.
  // If both are specified, `socketPath` is used.
  socketPath: null, // default

  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
  // `keepAlive` 默认没有启用
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),
  // 'proxy' 定义代理服务器的主机名称和端口
  // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
  // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定用于取消请求的 cancel token
  // (查看后面的 Cancellation 这节了解更多)
  cancelToken: new CancelToken(function (cancel) {
  })
}

更多精彩内容请持续关注本站!

猜你喜欢

转载自blog.csdn.net/sinat_30844883/article/details/142882216