当前位置:   article > 正文

vue2.0-axios_vue2调取引axios

vue2调取引axios

axios简介


Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

axios是我们在vue项目中常见封装http请求相对受欢迎的,优点如下:

简单易用,api接近于jquery,比原生的fetch之类的简单,

浏览器兼容性好,都能兼容IE7,使用fetch就得自己处理兼容

通用性好,能在node和浏览器中使用

api一致 稳定大牌,vue官网文档有推荐

以上几点呢,是大多数公司选择使用axios的主要原因,通过简单的了解我们应该知道axios是干嘛的了,请求这里指的是数据的传输,web端http属于单向的,你问了他就告诉你,服务端不会主动告诉你,这个就叫http请求,因为有协议的原因,所以这里很多人还是不能熟练掌握,具体请求具体传参,所以我准备专门介绍一下,各请求之间我是如何判断该何如传参的:

  1. 先说一下request 他是一个任意类型的请求,你在mehod: ‘请求别名’ 比如:get post 都可以
  2. get 向指定资源请求数据,一般用来获取,查询资源信息,较不安全,幂等(幂等是对同一URL的多个请求应该返回同样的结果)的,只用来获取数据不会修改数据,其请求显示在url上,会被缓存,对请求长度有限制。和post是常用的提交方式。
  3. delete 请求服务器器删除Request-URI所标识的资源。
  4. head是需要向服务器索要与get一样的请求,但是不返回返回体,这个方法可以在不必传输整个响应内容的情况下,获取包含在响应消息头中的元信息。
  5. option返回给服务器针对特定资源所支持的请求方式,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
  6. post 向指定资源提交数据进行请求处理,一般用来更新资源信息,非幂等,请求显示在请求体里面,不会被缓存,对请求长度无限制。
  7. put 向指定资源上传最新的内容
  8. patch方法用来更新部分资源,然而PATCH和POST都是非幂等的,POST请求服务器执行一个动作,多次请求会多次执行。PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的数据。也就是说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响POST方法和PATCH方法它们的实体部分都是结构化的数据,所以PAtch也是非幂等的。POST方法的实体结构一般是 multipart/form-data或 application/x-www-form-urlencoded而PATCH方法的实体结构则随其它规范定义。这和PUT方法的无结构实体相比就是最大的区别。

axios 默认配置

  1. axios.defaults.baseURL="http://localhost:8888/";
  2. axios.defaults.timeout=4000;

axios get请求

  1. //get请求方式一:
  2. axios({
  3. // 默认请求方式为get
  4. method: 'get',
  5. url: 'api',
  6. // 传递参数
  7. params: {
  8. key: value
  9. },
  10. // 设置请求头信息
  11. headers: {
  12. key: value
  13. }
  14. responseType: 'json'
  15. }).then((response) => {
  16. // 请求成功
  17. let res = response.data;
  18. console.log(res);
  19. }).catch((error) => {
  20. // 请求失败,
  21. console.log(error);
  22. });
  23. //get请求方式二:
  24. axios.get("api", {
  25. // 传递参数
  26. params: {
  27. key: value
  28. },
  29. // 设置请求头信息,可以传递空值
  30. headers: {
  31. key: value
  32. }
  33. }).then((response) => {
  34. // 请求成功
  35. let res = response.data;
  36. console.log(res);
  37. }).catch(error => {
  38. // 请求失败,
  39. console.log(error);
  40. });

axios post请求

  1. //post普通方式:
  2. axios({
  3. method: 'post',
  4. url: 'api',
  5. // 传递参数
  6. data,
  7. // 设置请求头信息
  8. headers: {
  9. key: value
  10. },
  11. responseType: 'json'
  12. }).then((response )=> {
  13. // 请求成功
  14. let res = response.data;
  15. console.log(res);
  16. }).catch(error => {
  17. // 请求失败,
  18. console.log(error);
  19. });
  20. //post别名的方式:---注意post传参的key是data,get的是params
  21. let headers = {
  22. TOKEN: ""
  23. };
  24. axios.post("api", data, {headers}}).then((response) => {
  25. // 请求成功
  26. let res = response.data;
  27. console.log(res);
  28. }).catch((error) => {
  29. // 请求失败,
  30. console.log(error);
  31. });

axios发送并发请求

  1. //方法一:请求成功时响应的是一个数组
  2. axios.all([
  3. axios.get('http://localhost:8888/info'),
  4. axios.get('http://localhost:8888/infos')
  5. ]).then((res) => {
  6. console.log(res[0]); //第一个axios请求得到的
  7. console.log(res[1]); //第二个axios请求得到的
  8. }).catch((err) => {
  9. console.log(err);
  10. })
  11. //采用axios提供的spread函数处理响应数组结果
  12. axios.all([
  13. axios.get('http://localhost:8888/info'),
  14. axios.get('http://localhost:8888/infos')
  15. ]).then(axios.spread((res1,res2) =>{
  16. console.log(res1); //第一个axios请求得到的
  17. console.log(res2); //第二个axios请求得到的
  18. })).catch((err) => {
  19. console.log(err);
  20. })

axios 封装

例一:

  1. // 对axios的一次封装
  2. import axio from 'axios'
  3. import store from '../store'
  4. import { removeItem } from '../utils/localStorage'
  5. import { Toast } from 'vant'
  6. import router from '@/router'
  7. Toast.setDefaultOptions({ forbidClick: true })
  8. const axios = axio.create({
  9. baseURL: 'http://123.60.80.68:8100/',
  10. // baseURL: 'http://192.168.0.231:8080/',
  11. timeout: 30000
  12. })
  13. // 请求拦截器,实现token的统一添加;
  14. axios.interceptors.request.use(
  15. config => {
  16. if (store.state.token) {
  17. config.headers.accessToken = store.state.token
  18. }
  19. return config
  20. }, err => {
  21. return Promise.reject(err)
  22. })
  23. axios.interceptors.response.use(
  24. response => {
  25. // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
  26. // 否则的话抛出错误
  27. if (response.status === 200) {
  28. return Promise.resolve(response.data)
  29. } else {
  30. return Promise.reject(new Error(res.message || 'Error'))
  31. }
  32. },
  33. // 服务器状态码不是2开头的的情况
  34. // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  35. // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
  36. // 下面列举几个常见的操作,其他需求可自行扩展
  37. error => {
  38. if (error.response.data.status) {
  39. switch (error.response.data.status) {
  40. // 401: 未登录
  41. // 未登录则跳转登录页面,并携带当前页面的路径
  42. // 在登录成功后返回当前页面,这一步需要在登录页操作。
  43. case 401:
  44. router.replace({
  45. path: '/login'
  46. })
  47. break
  48. // 403 token过期
  49. // 登录过期对用户进行提示
  50. // 清除本地token和清空vuex中token对象
  51. // 跳转登录页面
  52. case 6001:
  53. Toast({
  54. message: '登录过期,请重新登录',
  55. duration: 1000,
  56. forbidClick: true
  57. })
  58. // 清除token
  59. removeItem('user')
  60. store.commit('setUser', null)
  61. store.commit('setToken', '')
  62. // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
  63. setTimeout(() => {
  64. router.replace({
  65. path: '/login'
  66. })
  67. }, 1000)
  68. break
  69. // 404请求不存在
  70. case 404:
  71. Toast({
  72. message: '网络请求不存在',
  73. duration: 1500,
  74. forbidClick: true
  75. })
  76. break
  77. // 其他错误,直接抛出错误提示
  78. default:
  79. Toast({
  80. message: error.response.data.message,
  81. duration: 1000,
  82. forbidClick: true
  83. })
  84. }
  85. }
  86. return Promise.reject(error.response.data.message)
  87. })
  88. export default axios

例二:

  1. import axios from 'axios'
  2. let baseURL;
  3. if(process.env.NODE_ENV === 'development') {
  4. baseURL = 'xxx本地环境xxx';
  5. } else if(process.env.NODE_ENV === 'production') {
  6. baseURL = 'xxx生产环境xxx';
  7. }
  8. // 实例
  9. let instance = axios.create({
  10. baseURL: baseURL,
  11. ...
  12. })
  13. //设置axios拦截器: 请求拦截器
  14. axios_instance.interceptors.request.use(config => {
  15. //得到请求方式和请求体数据
  16. const {method,data} = config;
  17. if(method.toLowerCase() == 'post' && typeof data == 'object'){
  18. config.data = qs.stringify(data)
  19. }
  20. config.headers['X-Token'] = getToken()
  21. return config;
  22. }, err => {
  23. // 请求未成功发出,如:没有网络...
  24. return Promise.reject(err)
  25. })
  26. //设置axios拦截器: 响应拦截器
  27. axios_instance.interceptors.response.use(res => {
  28. // 成功响应的拦截
  29. const data = res.data;
  30. const code = data.code;
  31. if(code == 200 ){
  32. return data;
  33. }else{
  34. return Promise.reject(data);
  35. }
  36. }, err =>{
  37. //请求的地址错误 会进入这里
  38. console.log(err)
  39. return Promise.reject(err)
  40. })
  41. //接口的封装
  42. import request from './requst'
  43. /* 登录 */
  44. export function login (data) {
  45. return request({
  46. url: '/login_auth/login',
  47. method: 'get',
  48. params: data
  49. })
  50. }
  51. 使用请求别名:
  52. // 获取用户信息
  53. export function getInfo () {
  54. return request.get('/system/user/getLoginUser')
  55. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/1001559
推荐阅读
相关标签
  

闽ICP备14008679号