数据交互系列:简述vue项目中的两种请求方式(axios和vueResource)

这篇具有很好参考价值的文章主要介绍了数据交互系列:简述vue项目中的两种请求方式(axios和vueResource)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天学习了vue的两种发送请求的方式,vueResource和axios,比较了两种方式的使用

VueResource模块发送请求

1. VueResource概述
  • VueJS的生态圈除了VueRouter之外,还有很多的插件,在网络请求中,vue是借助于vue-resource模块来进行异步请求,跨域请求。
  • vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应。也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且vue-resource的API更为简洁。
  • 特点
    • 体积小,vue-resource非常小巧,在压缩以后只有大约12KB,服务器启用gzip压缩后只有4.5KB大小。
    • 支持主流的浏览器,和vuejs一样,vue-resource除了不支持IE9以下的浏览器,其他主流的浏览器都支持。
    • 支持PromiseAPI和URI Templates,Promise是es6的特性,Promise的中文含义为"先知",Promise对象用于异步计算。URl Templates表示URI模块,有些类似于ASP.NET MVC的路由模块。
    • 支持拦截器
      拦截器是全局的,拦截器可以在请求发送前和发送请求后做一些处理。
      拦截器在一些场景上非常有用,比如请求发送前在headers中设置access_token,或者在请求失败时,提供共通的处理方式。
2. VueResource的使用步骤
  • 使用步骤

  • cdn 下载网址
    https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js

  • 安装vue-resource

  npm install --save vue-resource
  • 引入vue-resource模块
  import VueResource from 'vue-resource'
  Vue.use(VueResource)
  • 调用模块中$http发起请求
   this.$http.get('url')
   .then(function(response){
        ....
   })
  • 在组件实例加载完之后,会自动调用vueResource这个模块
<script>
    Vue.use(vueResource)
    new Vue({
        el:'#app',
        mounted(){
            this.$http.get('http://localhost:5050/index')
            .then(result=>{
                console.log(result.data)
            })  //发送get请求
           
            this.$http.get('http://localhost:5050/details',{
                params:{lid:5}
            }).then(result=>{
                console.log(result.data)
            }) //发送带数值的get请求
            
            this.$http.post('http://localhost:5050/users/signin',{
                uname:"dingding",
                upwd:'123456'
            }).then(result=>{
                console.log(result.data)
            })//发送post请求
        }
        
    })
</script>

axios方式发送请求

1. axios概述
  • 从vue2.0开始已经在推崇用新的方法(axios)来代替vue-resource
  • Axios跟vue无关,在任何平台都可以发送请求,比如nodejs 网页等
  • 所以从新版的vue开始,vue-resource已经不再被使用
2. axios的使用步骤
  • cli中axios的使用
// main.js
import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
注册方式1:Vue.use(VueAxios,axios)
注册方式2:Vue.prototype.axios=axios


//使用
this.axios.get('demo/getTest?user=tom')
  .then((res)=>{
      console.log(res.data)
  })
  • html中axios的使用
<head>
     <script src="js/axios.min.js"></script>
     <script src="js/vue.min.js"></script>
</head>
<body>
    <div id="app">
        axios.default.baseURL="http://localhost:5050"
        Vue.prototype.axios=axios
        new Vue({
            el:'#app',
            mounted(){
                this.axios.get('/index').then(result=>{
                    console.log(result.data)
                })
            }
        })
    </div>
</body>
3. Ajax应该在哪个生命周期
  • 有两个选择 created 和 mounted
  • 推荐 mounted
原因
created阶段钩子函数已经可以去读取数据,mounted阶段钩子函数组件已经渲染完成,由于ajax请求是异步,当获取到数据时,从beforeCreate到mounted已经运行完了,所以在created和mounted发送请求都可以。
模拟操作
@/utils/data.js
function getData(){
	return new Promise((resolve)=>{
		setTimeout(()=>{
			resolve(1000)
		},2000)
	})
}
export default getData
// home.vue

<div> {{count}} </div>
import getData from  ../utils/data
export default{
	async created(){
	    let result=await getData()
		this.count=result
	},
	mounted(){
		console.log('mounted')
	},
	activated(){
		console.log('activated')
	},
	deactivated(){
		console.log('deactivated')
	},
	updated(){
		console.log(this.data)
	}, 
	//组件渲染完,状态发生改变才会打印
	//控制台的update有打印,说明在mounted和created中发送请求获取数据是在组件渲染之后,并且再一次更新dom树。这也说明后台获取的数据无法做一次渲染
	data(){
		return{
			count:100
		}
	}
}


4. 实际项目中封装axios实例和请求方法的思路
  1. 在utils公共方法文件夹的request.js中
// 导入axios
import axios from 'axios'
// 创建axios实例
const service = axios.create({
  // 公共接口--这里注意后面会讲
  baseURL: process.env.BASE_API,
  //   baseURL: '/api',
  // 超时时间 单位是ms,这里设置了3s的超时时间
  timeout: 10 * 1000
})

// 设置请求和响应的拦截器
service.interceptors.request.use(config => {},error=>{})
service.interceptors.response.use(response => {},error=>{})
  1. 在utils公共方法文件夹的http.js中导入axios实例
// 导入封装好的axios实例
// 封装 get put delete post请求方法
import request from './request'
const http = {
  /**
   * methods: 请求
   * @param url 请求地址
   * @param params 请求参数
   */
  get (url, params) {
    const config = {
      method: 'get',
      url: url
    }
    if (params) config.params = params
    return request(config)
  },
  getData (url, data) {
    const config = {
      method: 'get',
      url: url
    }
    if (data) config.data = data
    return request(config)
  },
  post (url, params) {
    const config = {
      method: 'post',
      url: url
    }
    if (params) config.data = params
    return request(config)
  },
  put (url, params) {
    const config = {
      method: 'put',
      url: url
    }
    if (params) config.params = params
    return request(config)
  },
  delete (url, params) {
    const config = {
      method: 'delete',
      url: url
    }
    if (params) config.params = params
    return request(config)
  }
}
export default http
  1. 在api文件夹的api.js中写接口
import request from '@/utils/request'
import http from '@/utils/http'

// 两种方式写接口
// 举例
// 登录接口
export function login (data) {
  return request({
    url: 'api/logn',
    method: 'post',
    data: data,
  })
}

// 首次任务开启接口
export function startJob (id) {
  return request({
    url: 'api/jb/strt?factoryId='+id,
    method: 'get'
  })
}

// 同步任务接口
export function manualStartJob (param) {
  return http.post('api/job/StartJob', param)
}

...

  1. 在组件中xxx.vue 使用封装好的接口方法
import {login,startJob,manualStartJob} from './api/api'

vue项目中解决跨域问题

  • 跨域的原因:浏览器同源策略
同源策略

著名的安全策略,注意:同源策略不是服务器行为,而是浏览器行为。 vue-resource和axios,交互,Vue,vue.js,javascript,前端

前端跨域报错:

vue-resource和axios,交互,Vue,vue.js,javascript,前端

服务端解决跨域问题
  • 上线需要使用nginx代理或者服务器配置cors(每中语言有自己得配置方式)
  • 以nodejs的express框架为例:
npm i cors

let express=require('express')
let cors=requrie('cors')
let app=express()
app.listen(3000,()=>{
    console.log('3000端口,已启动') 
})

// 配置跨域
app.use(cors,{
    //允许跨域的服务器地址,可以写多个
    origin:['http://127.0.0.1:8080','http://localhost:8080']
})
vue项目实现跨域的原理

跨域是浏览器得安全策略,服务器和服务器之间发送请求没有跨域,在启动脚手架时会启动一个内置得web服务器,在请求时浏览器并没有直接和需要请求得服务器通信,而是通过内置得web服务器中转。

注意:项目上线需要把打包后得文件放在服务器运行,而不是启动脚手架运行,所以没有内置服务器中转请求,此方式只适用于开发阶段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooWbZ0TL-1683602902114)(https://note.youdao.com/yws/res/21666/WEBRESOURCE6ba5b29fcadfc7a73bef6dce6bae9ad2)]

@vue/cli4.5中处理
  • 一般情况下如果需要使用低版本得脚手架,需要重新安装脚手架
  • 当然,npx 可以临时创建一个目录,使用4.5的脚手架
npx @vue/cli@4.5 create vue2
  • 需要手动创建一个vue.config.js
modules.export={
    devServer:{
        // 配置代理服务器
        proxy:{
            //定义处理那种请求的开头
            //以后只要以/demo为开头的请求,都会被处理
            '/demo'{
                // 往哪个服务器里发送请求
                target:'http://127.0.0.1:3000',
                pathRewrite:{
                    // ^代表字符串开头,实际发送请求时把/demo替换成''
                    // 因为/demo并不是请求的一部分,只是代理的标识
                    '^/demo':''
                }
            }
        }
        
    }
}
@vue/cli5.0中处理
在vue脚手架中 5.0之后的版本会默认有vue.config.js文件,解决跨域问题需要在该文件中配置代理服务器
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: truedevServer:{
       //配置代理服务器
       proxy:{
            //定义处理那种请求的开头
            //以后只有是以/demo为开头的请求,都会被处理
           '/demo':{
                //往哪个服务器发送请求
                target:’http://127.0.0.1:3000,
                PathRewrite:{
                     //^代表字符串开头,实际请求时把/demo替换成‘‘
                     // 因为/demo并不是请求得一部分,只是代理的标识
                    '^/demo':''
                }
            }
        }
    }
})    
配置完后重启脚手架生效…….

拦截器

VueRource 使用拦截器

vue-resource和axios,交互,Vue,vue.js,javascript,前端

//cli
Vue.prototype.http=vueRource
Vue.http.interceptors.push((req,next)=>{
    //请求发送前的处理逻辑
    next((res)=>{
        //请求发送后的处理逻辑
        //res参数会返回给successCallback
        //或 errorCallback
        return res
    })
})
//cdn
<div id="app"></div>
<script>
    Vue.use(vueResource)
    Vue.$http.interceptors.push((req,next)=>{
        console.log('发送请求前拦截')
        console.log(req)
        next((res)=>{
            console.log('收到响应结果后拦截')
            console.log(res)
        })
    })
    new Vue({
        el:'#app'
        data:{
            ...
        },
        methods:{
           ...  
        },
        ...
    })
</script>
axios 使用拦截器

axios.interceptors.response.use
vue-resource和axios,交互,Vue,vue.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-783551.html

import axios from 'axios'
var axios=axios.create() // 创建一个实例
axios.interceptors.request.use(config=>{ //请求拦截器
    console.log('在发送请求前拦截...')
    console.log(config)
    return config       
})
axios.interceptors.response.use(
  res=>{  //响应拦截器
      console.log(`在收到响应后拦截...`)
      console.log(res)
      return res
  }
)
  • 案例
/** **   request.js   ****/
// 导入axios
import axios from 'axios'
import { message } from 'ant-design-vue'
// 1. 创建新的axios实例,
const service = axios.create({
  // 公共接口--这里注意后面会讲
  baseURL: process.env.BASE_API,
  //   baseURL: '/api',
  // 超时时间 单位是ms,这里设置了3s的超时时间
  timeout: 10 * 1000
})
// 2.请求拦截器
service.interceptors.request.use(config => {
  // 发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
  //   config.data = JSON.stringify(config.data) // 数据转化,也可以使用qs转换
  //   config.data = config.data
  config.headers = {
     // 'Content-Type': 'application/x-www-form-urlencoded' // 配置请求头
  }
  // 注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
  // 这里取token之前,你肯定需要先拿到token,存一下
  if (sessionStorage.getItem('session')) {
    // config.headers['authorization'] = sessionStorage.getItem('session')
  }
  // config.withCredentials = true
  return config
}, error => {
  Promise.reject(error)
})

// 3.响应拦截器
service.interceptors.response.use(response => {
  // 接收到响应数据并成功后的一些共有的处理,关闭loading等
  if (response.data.code === 10000) {
    message.error('用户信息过期,请重新登录')
    window.localStorage.removeItem('sync-session')
    window.sessionStorage.removeItem('sync-session')
    location.href = ('/sync/#/')
  }
  return response
}, error => {
  /** *** 接收到异常响应的处理开始 *****/
  if (error && error.response) {
    // 1.公共错误处理
    // 2.根据响应码具体处理
    switch (error.response.status) {
      case 400:
        error.message = '错误请求'
        break
      case 401:
        error.message = '未授权,请重新登录'
        break
      case 403:
        error.message = '拒绝访问'
        break
      case 404:
        error.message = '请求错误,未找到该资源'
        // window.location.href = '/NotFound'
        break
      case 405:
        error.message = '请求方法未允许'
        break
      case 408:
        error.message = '请求超时'
        break
      case 500:
        error.message = '服务器端出错'
        break
      case 501:
        error.message = '网络未实现'
        break
      case 502:
        error.message = '网络错误'
        break
      case 503:
        error.message = '服务不可用'
        break
      case 504:
        error.message = '网络超时'
        break
      case 505:
        error.message = 'http版本不支持该请求'
        break
      default:
        error.message = `连接错误${error.response.status}`
    }
  } else {
    // 超时处理
    if (JSON.stringify(error).includes('timeout')) {
      message.error('服务器响应超时,请刷新当前页')
    }
    error.message = '连接服务器失败'
  }

  message.error(error.message)
  /** *** 处理结束 *****/
  // 如果不需要错误处理,以上的处理过程都可省略
  return Promise.resolve(error.response)
})
// 4.导入文件
export default service

到了这里,关于数据交互系列:简述vue项目中的两种请求方式(axios和vueResource)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构学习系列之顺序表的两种插入方式

    方式1: 在顺序表 末端插入 数据元素,代码如下: 示例代码: 注意事项: 1.形参传入到具有插入数据元素功能的函数后,需要做 入参合理性检查 ; 2.还需要判断此时 顺序表所存储的数据元素是否已满 ; 3.本示例代码中的 count是计数的变量 , 每次插入一个数据元素后,需

    2024年02月10日
    浏览(28)
  • ES系列:修改索引名,又不丢失数据的两种方法

    目录 方法1: 例子 方法2 例子 这个非常简单,使用重命名方法即可。 将索引testindex-old修改为testindex-new

    2024年02月11日
    浏览(34)
  • Vue中强制更新数据的两种方式

    有时候我们发现修改了数据源后视图并没有更新,这里提供两种解决方案 Vue中强制更新数据的方法有两种。 方法一: 使用forceUpdate强制渲染,更新视图和数据。 注:全局强制刷新,性能消耗高。 方法二: this.$set()方法是Vue自带的可对数组和对象进行赋值,并触发监听的方法

    2024年02月11日
    浏览(43)
  • vue2创建项目的两种方式,配置路由vue-router,引入element-ui

    提示:vue2依赖node版本8.0以上 使用@vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创建 1、查看nodejs版本 2、全局安装vue脚手架和webpack脚手架 3、新建vue2项目 创建选项除了,Install vue-router??选择是,其他选择的否 4、安装依赖并启动文件 5、预览 6、目录结构 1、如果安

    2024年04月14日
    浏览(33)
  • 关于部署vue项目在Linux上的两种方式tomcat以及nignx(3)使用nignx进行部署

    阿丹有话说:         前两篇文章主要讲解了将vue中tomcat部署研究了。解决了在后台代码中通过过滤器来解决跨域问题。后期会继续出在tomcat中的代理配置等。本篇文章来将vue项目部署在nignx上,并且通过反向代理来解决跨域请求以及请求转发。  首先我们再来了解一下ngi

    2024年02月04日
    浏览(44)
  • 关于部署vue项目在Linux上的两种方式tomcat以及nignx(1)使用tomcat进行部署

    阿丹有话说:         之前在写spring-boot项目的时候是直接写的jsp页面直接打成war包来运行。使用到了tomcat,而且简单方便,但是美中不足就是动画演示以及页面没有办法做的非常美观。自从开始写前后端分离的项目(微服务等)之后,发现element-ui是真的好用。现在想给vue的

    2024年02月03日
    浏览(42)
  • C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式

    文本行输入函数:fgets(读文本) 函数原型 参数 str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。 n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。 stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字

    2023年04月08日
    浏览(28)
  • [Vue]从数据库中动态加载阿里巴巴矢量图标的两种方式

    记录一次在Vue中动态使用阿里巴巴矢量图标库 这是本人第一次使用阿里巴巴的矢量图标库,简单的导入和使用的话网上的教程很多,这里不多赘述,本人的需求是从数据库中加载出来并且显示到页面上,接下来简述一下如何实现。 以下代码均是本人实际推敲、测试可用后写

    2024年01月20日
    浏览(41)
  • docker中创建容器的两种方式(交互式与守护式)

    当使用Docker时,有两种常见的方式来创建容器:交互式方式和守护式方式。本文将详细介绍这两种方式以及相关的命令,并结合具体案例进行说明。 交互式方式创建容器是指在容器内部启动一个交互式会话,类似于在终端中登录到一个虚拟机。您可以直接与容器进行交互,并

    2024年02月03日
    浏览(39)
  • 【SpringBoot系列】Springboot使用kafka的两种方式

    🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包