Vue跨域问题、Vue配置开发环境代理服务、集成Axios发送Ajax请求、集成vue-resource发送Ajax请求

本文主要是介绍Vue跨域问题、Vue配置开发环境代理服务、集成Axios发送Ajax请求、集成vue-resource发送Ajax请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. Ajax请求服务介绍
  • 2. axios的安装
  • 3. Vue跨域问题介绍和解决方案
  • 4. 使用vue-cli配置开发环境代理服务
    • 4.1 简单配置
    • 4.2 复杂配置
    • 4.3 二次封装
  • 5. 集成vue-resource发送Ajax请求

1. Ajax请求服务介绍

  1. xhr: new XHLHttpRequest().open()/send()。偏向底层
  2. JQuery: 对xhr进行了封装。提供$get、$post等API。封装了太多DOM操作,不适合Vue
  3. axios: 基于promise的网络请求库,支持请求拦截器和响应拦截器,体积小,只有JQuery的1/4
  4. fetch: Window.prototype上直接有这个方法,也是基于promise的。但是会将返回的请求包两层promise,需要两次.then才能拿到请求,IE浏览器兼容性差

2. axios的安装

使用命令cnpm install axios安装项目包

3. Vue跨域问题介绍和解决方案

  • Vue使用Axios请求不同端口的服务,会出现类似下面的错误。即CORS跨域问题
Access to XMLHttpRequest at 'http://localhost:5000/students' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 只要【协议名】【IP】【端口】不同的服务请求就会出现跨域问题
  • 出现跨域问题,服务器能接收到请求,浏览器也能接收到数据,但是浏览器发现存在跨域问题,就对数据进行拦截,Axios出现error报错
  • 解决跨域问题的方法
    1. 服务器可以给Header中配置Access-Control-Allow-Origin,这样浏览器就不会进行数据的拦截,但是安全性不高
    2. jsonp解决跨域问题,借助script标签的src属性,在引入外部资源的时候,不受同源策略限制,需要前后端配置,而且只能解决get请求跨域问题,所以用的少
    3. 配置代理服务器。代理服务器和运行的Vue服务在同一台服务器,而且端口是一样的。虽然代理服务器和返回数据的服务器端口不一样,但是他们之间通信不用前端的Ajax,即不存在跨域问题。代理服务器种类
      1. Nginx
      2. vue-cli

4. 使用vue-cli配置开发环境代理服务

4.1 简单配置

在vue.config.js配置。这种方式只能配置一个接收请求的服务器

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({devServer: {// 接收请求的服务器IP和端口proxy: 'http://localhost:5000'}
})

App.vue:Axios发送请求示例如下:

  • axios发送的请求,是代理服务器的IP和端口
  • 如果发送请求的资源在public目录下存在,如http://localhost:8080/favicon.ico,则不会向服务器发出请求
<template><div><button @click="getStudents">获取学生信息</button></div>
</template><script>import axios from 'axios'export default {name:'App',methods: {getStudents(){// 代理服务器的IP和端口axios.get('http://localhost:8080/students').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败了',error.message)})}}}
</script>

4.2 复杂配置

  • 可以配置多个接收请求的服务器。可以配置请求URL访问路径前缀
  • 如果使用vite构建的项目,可以参考vite服务器选项server-proxy

在vue.config.js配置:axios请求的路径是http://localhost:8080/api1/students,最终代理服务器发送的请求url是http://localhost:5000/students

  devServer: {proxy: {// 请求的URL符合前缀才走代理'/api1': {target: 'http://localhost:5000',// 匹配以/api1开头的路径,然后将/api1替换成''pathRewrite:{'^/api1':''},ws: true,    // 用于支持websocketchangeOrigin: true    // 默认是true, 代理服务器告诉请求的服务器,我的端口和你一样是5000。如果是false,则告诉请求的服务器我是代理服务器,我的端口是8080},'/api2': {target: 'http://localhost:5001',pathRewrite:{'^/api2':''},ws: true,changeOrigin: true}}}

App.vue

<template><div><button @click="getStudents">获取学生信息</button><button @click="getCars">获取汽车信息</button></div>
</template><script>import axios from 'axios'export default {name:'App',methods: {getStudents(){axios.get('http://localhost:8080/api1/students').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败了',error.message)})},getCars(){axios.get('http://localhost:8080/api2/cars').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败了',error.message)})}}}
</script>

4.3 二次封装

  • 目的:

    1. 利用axios请求拦截器功能(一般可以在headers中携带公共的参数,如token)
    2. 利用axios响应拦截器功能(可以简化服务器返回的数据, 和处理http网络错误)
  • 二次封装代码如下:

import axios from 'axios'
import {ElMessage} from 'element-plus'// 创建一个axios实例, 可以设置基础路径、超时时间
const request = axios.create({baseURL: '/api',timeout: 5000
})// 请求拦截器
request.interceptors.request.use((config) => {config.headers.token = 123456return config
})// 响应拦截器
request.interceptors.response.use((response) => {return response.data
}, (error) => {// 处理http网络错误let status = error.response.statusswitch (status) {case 400 | 404:// 错误提示信息ElMessage({type: 'error',message: error.response.message})breakdefault:ElMessage({type: 'error',message: '请求出错了'})}return Promise.reject(new Error(error.message))
})export default request

二次封装的request的使用如下:

import request from "request"request.get('/user').then(res => {console.log(res)
})

5. 集成vue-resource发送Ajax请求

vue-resource也是基于promise的。使用命令cnpm install vue-resource安装vue-resource的项目包

使用示例
App.vue:直接调用VueComponent.$http发送请求

<template><div><button @click="getGithubUsers">获取Github的用户信息</button></div>
</template><script>
export default {name:'App',data() {return {uname:'test'}},methods: {getGithubUsers(){// github服务器给我们解决了跨域问题this.$http.get(`https://api.github.com/search/users?q=${this.uname}`).then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败了',error.message)})}}
}
</script>

main.js:使用vueResourceEsm插件

import Vue from 'vue'
import App from './App.vue'
import vueResourceEsm from "vue-resource";
Vue.config.productionTip = false// 使用插件
Vue.use(vueResourceEsm)new Vue({el:'#app',render: h => h(App)
})

这篇关于Vue跨域问题、Vue配置开发环境代理服务、集成Axios发送Ajax请求、集成vue-resource发送Ajax请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141781

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作