【Vue】学习笔记-Vue中的Ajax配置代理

news2024/11/28 0:33:05

回顾

常用的发送Ajax请求的方法有哪些?

  • xhr​​ new XMLHttpRequest() xhr.open()、xhr.send()(真正开发中很少用到,太麻烦了,我们一般使用的都是他的二次封装) ​
  • jQuery​​ 其对xhr有二次封装 . g e t ( ) 、 .get()、 .get().post ​​axios​​ Promise风格,体积比jQuery小,并且支持请求拦截器、响应拦截器等等(最常用,也是Vue推荐的发送Ajax请求的方法)
  • ​​fetch​​ 跟xhr是平级的,它在window内置对象上直接存在!并且其也是Promise风格的,IE不支持(也有人使用)

尝试使用axios发送Ajax请求

假设现在已经开好了两台服务器
在本机的5000端口,使用get请求我们可以获取学生信息
在这里插入图片描述
我们在页面上创建一个按钮,点击即可发送get请求获的学生数据:

<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:5000/students').then(
					response => {
						console.log('请求成功了',response.data)
					},
					error => {
						console.log('请求失败了',error.message)
					}
				)
			},
			getCars(){
				axios.get('http://localhost:5000/demo/cars').then(
					response => {
						console.log('请求成功了',response.data)
					},
					error => {
						console.log('请求失败了',error.message)
					}
				)
			}
		},
	}
</script>

在这里插入图片描述
很明显这是一个跨域问题,也就是说我们违背了​​同源策略​​

复习:同源策略规定了三个东西必须一致
①协议名
②主机名
③端口号

我们现在所处的位置是localhost:8080

也就是说此时我们所处的状态:
使用的http协议
主机名是localhost
端口号是8080

但服务器所处的状态:
使用的http协议
主机名是localhost
端口号是5000
在这里插入图片描述
所以说并不同源,故发生了跨域问题

跨域问题的过程:浏览器发出请求之后,服务器接收到了请求。​​同时服务器也会把数据交给本地浏览器​​​。​​浏览器也收到了这个数据​​,但是浏览器发现这里存在跨域问题,所以浏览器不会把这个数据交给用户!

那么我们如何解决跨域问题呢?
这里有几种思路:

  • ​​cors​​ 最标准的解决办法 使用这个方法不用前端人员去做任何事情。其原理是:写服务器的人,让服务器给我们返回数据的时候加几个响应头,而浏览器看到了这几个响应头,就会放行,把数据给我们。
  • ​​jsonp​​ 借助script标签的src属性。(真正开发基本不用!,因为其需要前后端一起配合,并且只能解决get请求的跨域问题)

使用代理服务器解决跨域问题的原理

在这里插入图片描述
左边红色方框代表本地浏览器,中间的粉色方框代表代理服务器,右边的蓝色方框代表服务器。

左边这个8080服务器,是Vue脚手架帮我们开启的,用来支撑脚手架的运行

这个代理服务器与我们所处的端口号一定是一样的!

当我们向服务器请求学生信息的时候,我们不直接请求服务器,而是找代理服务器,代理服务器收到了我们本次请求之后,他会帮我们把请求转发给服务器。然后服务器会把数据交给代理服务器,最后代理服务器再把数据交给我们。

从这个过程中我们不难看出,代理服务器有点“中介”的味道
在这里插入图片描述
有人可能会问这两条线难道不会存在跨域问题吗?
当然不会
!左边的是代理服务器,右边的是服务器。服务器与服务器之间传数据压根就不用Ajax,Ajax它是一种前端技术!

Vue脚手架配置代理

既然我们知道了要用代理服务器来解决跨域问题,那么我们怎么开启这个服务器呢?
这里有两种常用的方法:

​​nginx​​
​​vue-cli​​ (也就是借助Vue脚手架)
这里我们使用第二种方式,他更加的简单。

方法一
打开Vue-CLI的配置参考,找到devServer.proxy
devServer.proxy

在这里插入图片描述
注意:这个proxy配置项里面填的是代理服务器向哪一个服务器拿东西

根据上面的案例(向5000端口的服务器要学生数据),代码如下:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
   devServer:{
    proxy:'http://localhost:5000'
  }, 
  })

因为我们修改了Vue的配置文件,所以必须重启脚手架才能生效、

在这个基础上我们修改请求的服务器:
src\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/students').then(
					response => {
						console.log('请求成功了',response.data)
					},
					error => {
						console.log('请求失败了',error.message)
					}
				)
			},
			getCars(){
				axios.get('http://localhost:5000/demo/cars').then(
					response => {
						console.log('请求成功了',response.data)
					},
					error => {
						console.log('请求失败了',error.message)
					}
				)
			}
		},
	}
</script>

在这里插入图片描述
这里有两个细节需要我们注意:

①这样配置代理服务器并非会把所有请求发给服务器。
当我们请求的资源8080服务器(本地服务器)本来就有的时候,代理服务器不会再把请求转发给服务器.
我们脚手架中的public文件夹就相当于8080服务器(本地服务器)的根路径。说直白点8080服务器中有什么public文件夹中就有什么。

我们可以举一个例子:
在这里插入图片描述
我们在students文件中写上112233。如果在这种情况下我们去请求,代理服务器不会把请求转发,而是直接返回112233.
在这里插入图片描述
②使用这种方式配置,只能配置一个代理服务器!
在这里插入图片描述
本例需要下载axios库 npm install axios
配置参考文档Vue-Cli devServer.proxy
vue.config.js 是一个可选的配置文件,如果项目的(和package.json同级的)根目录中存在这个文件,那么它会被@vue/cli-service 自动加载。你也可以使用package.json中的vue字段,但是注意这种写法需要你严格遵照JSON的格式来写
方法一
在vue.config.js中添加如下配置

devServer:{
  proxy:"http://localhost:5000"
}

说明:

  1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
  2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)

方法二
编写vue.config.js配置具体代理规则:

module.exports = {
	devServer: {
      proxy: {
      '/api1': {// 匹配所有以 '/api1'开头的请求路径
        target: 'http://localhost:5000',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api1': ''}//重写路径。也就是把/api1给替换为空格。否则会把/api1也放在url里带给服务器
      },
      '/api2': {// 匹配所有以 '/api2'开头的请求路径
        target: 'http://localhost:5001',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api2': ''}
      }
    }
  }
}
/*
   changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
   changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080
   changeOrigin默认值为true
*/

说明:

配置好后在访问目标服务器资源时。就要在端口后后面加/api1前缀。表示走代理服务器。不加表示不走代理。当然/api1可以换个名字。比如:/fhzm

  1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
  2. 缺点:配置略微繁琐,请求资源时必须加前缀。

如果不重写路径:
在这里插入图片描述

代理服务器在转发请求的时候,也会带上前缀。也就是说代理服务器是想要服务器上的​​/api1/students​​​数据,但我们的本意是要​​/students​​的数据。

解决这个问题我们需要另外一个配置项:​​pathRewrite​​
它的值是一个对象,里面包含着key和value。其中key写正则的匹配条件,value是替换的值

2、GitHub用户搜索案例
public\index.html

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <!-- 下面这行代码是针对IE浏览器的一个特殊配置,含义是让IE浏览器以最高的渲染级别渲染页面-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!--开启移动端的理想视口-->
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!--配置页签图标-->
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <!--引入第三方样式-->
    <link rel="stylesheet" href="<%= BASE_URL %>css/bootstrap.css">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <!--当浏览器不支持js时,noscript中的元素就会被渲染-->
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <!--容器-->
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>


src\App.vue

<template>
        <div class="container">
            <Search/>
            <List/>
        </div>  
</template>

<script>
import Search from "./components/Search.vue";
import List from "./components/List.vue"

    export default {
        name:"App",
        components:{ 
            Search,
            List
        },
        data(){
            return{
            }
        }
    }

</script>

src\components\List.vue

<template>
    <div class="row">
        <!-- 展示用户列表 -->
        <div v-show="info.users.length" class="card" v-for="u in info.users" :key="u.login">
            <a :href="u.html_url" target="_blank">
            <img :src="u.avatar_url" style='width: 100px'/>
            </a>
            <p class="card-text">{{u.login}}</p>
        </div>
        <!-- 展示欢迎词 -->
        <h1 v-show="info.isFirst">欢迎使用</h1>

        <!-- 展示加载 -->
        <h1 v-show="info.isLoading">加载中。。。。。</h1>

        <!-- 展示错误信息 -->
        <h1 v-show="info.errMsg">{{info.errMsg}}</h1>
    </div>
    
</template>

<script>
    export default{
        name:"List",
        data(){
            return{
                info:{
                    isFirst:true,
                    isLoading:false,
                    errMsg:"",
                    users:[]
                }
            }
        },
        methods:{
            allUsers(obj){
                this.info={...this.info,...obj};
            }

        },
        
        mounted(){
            this.$bus.$on("updateListData",this.allUsers);
        }
    }

</script>

<style scoped>
    .album {
    min-height: 50rem; /* Can be removed; just added for demo purposes */
    padding-top: 3rem;
    padding-bottom: 3rem;
    background-color: #f7f7f7;
    }

    .card {
    float: left;
    width: 33.333%;
    padding: .75rem;
    margin-bottom: 2rem;
    border: 1px solid #efefef;
    text-align: center;
    }

    .card > img {
    margin-bottom: .75rem;
    border-radius: 100px;
    }

    .card-text {
    font-size: 85%;
    }

</style>


src\components\Search.vue

<template>
    <section class="jumbotron">
        <h3 class="jumbotron-heading">Search Github Users</h3>
        <div>
            <input type="text" v-model="keyWord" placeholder="enter the name you search"/>&nbsp;
            <button @click="searchUsers">Search</button>
        </div>
    </section>
  
</template>

<script>

    import axios from "axios";
    //https://api.github.com/search/users?q=xxx
    export default{
        name:"Search",
        data(){
            return{
                keyWord:""
            }
        },
        methods:{
            searchUsers(){

                 this.$bus.$emit("updateListData",{isFirst:false,isLoading:true, errMsg:"",users:[]})

                axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
                response=>{
                  
                     this.$bus.$emit("updateListData",{isLoading:false, errMsg:"",users:response.data.items})
                },reason=>{
                      this.$bus.$emit("updateListData",{isLoading:false, errMsg:reason.message,users:[]})
                });
            },
        },
    }
</script>

<style>

</style>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【一起啃书】《机器学习》第八章集成学习

文章目录 第八章 集成学习8.1 个体与集成8.2 Boosting8.3 Bagging与随机森林8.4 结合策略8.5 多样性 第八章 集成学习 8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统、基于委员会的学习等&#xff0c;下面是集成学习的…

Mac下好用的日记、电子书阅读器、RSS订阅软件​

Mac下好用的日记笔记本、电子书阅读器和RSS订阅、播客订阅等软件推荐。我们收录到 Mac下好用的日记、电子书阅读器、RSS订阅软件​http://www.webhub123.com/#/home/detail?pLZPL-2ofIu 收录效果如下 ​也可以使用分组视图来查看各类软件网址 ​ 登录后可一键保存全部软件网址…

Java 集合 - Queue 接口

文章目录 1.Queue 接口2.LinkedList3.ArrayDeque4.PriorityQueue5.总结 队列是一种特殊的线性数据结构&#xff0c;在数据的尾部插入元素&#xff0c;在数据的头部删除元素。通常以 FIFO&#xff08;先进先出&#xff09;的方式存储和访问数据。Java 中提供了 Queue 接口来实现…

element-ui对话框dialog详解

效果展示 先给大家展示一下大致的样式 代码 <el-dialog draggable destroy-on-close v-model"dialogAddVisible" title"添加用户" width"35%" center><el-form :inline"true" :model"addFormInfo" status-icon …

Java中的String数据类型,String类(字符串)详解

目录 第一章、String概述1&#xff09;String是什么2&#xff09;String长什么样3&#xff09;String的构造方法(声明方式) 第二章、String类的详解1&#xff09;String底层是什么2&#xff09;字符串存储的内存原理/字符串常量池(String Constant Pool&#xff09;3&#xff0…

C语言-【指针二】-【指针运算/指针和数组】

好久不见吖&#xff0c;好啦&#xff0c;言归正传&#xff0c;这篇文章接着上篇文章的尾巴接着介绍指针相关知识哦&#xff01; 一.指针运算 &#xff08;1&#xff09;指针-整数 &#xff08;2&#xff09;指针-指针 &#xff08;3&#xff09;指针的关系运算 接下来&…

Apache Kafka - 高性能原因探究

文章目录 概述图解 概述 Kafka 的高性能主要依赖于以下几个关键因素: 分布式架构:Kafka 采用分布式集群架构,可以水平扩展到上万个节点,支持每秒处理百万级消息。持久化存储:Kafka 使用文件系统持久化存储消息,避免了数据库成为性能瓶颈,大大提高了吞吐量。顺序读写:Kafka 的…

计算机视觉:卷积核的运行过程

本文重点 我们前面从直观角度理解了卷积神经网络的卷积在特征提取的作用,本节课程我们从数学角度来看一下,卷积是如何计算的? 计算步骤 1. 将卷积核与输入图像的某一部分进行逐元素相乘。 2. 将相乘后的结果求和,得到卷积核在该部分的输出值。 3. 重复以上步骤,将卷积核…

达梦8逻辑备份导出导入dexp/dimp

逻辑导出&#xff08;dexp&#xff09;和逻辑导入&#xff08;dimp&#xff09;是 DM 数据库的两个命令行工具&#xff0c;分别用来实现对 DM 数据库的逻辑备份和逻辑还原。逻辑备份和逻辑还原都是在联机方式下完成&#xff0c;联机方式是指数据库服务器正常运行过程中进行的备…

数据结构作业4-图

图数据结构的小练习&#xff1a; 文章目录 数据结构作业4-图3 对图1所示的带权无向图。&#xff08;40分&#xff09;解&#xff1a; 4 对于图1所示的带权无向图。&#xff08;20分&#xff09;解&#xff1a; 5 已知带权有向图如下图所示&#xff0c;请利用Dijkstra算法从顶点…

基于操作系统的基础IO

1.c语言中的文件输入输出 在观看本章节的时候&#xff0c;大家可以去看看之前c语言的文件输入输出的有关博客。 好那么废话不多说之间进入本章正题: 我们都知道c程序默认会打开三个输入输出流&#xff1a; stdin&#xff1a;相当于键盘 stdout&#xff1a;相当于显示器 st…

【Linux】基本指令(四)

目录 &#x1f348;一.sort指令&#x1f348; &#x1f349;二.uniq指令&#x1f349; &#x1f34a;三.wc指令&#x1f34a; &#x1f34b;四.which指令&#x1f34b; &#x1f34e;五.whereis指令&#x1f34e; &#x1f34f;六.top指令&#x1f34f; &#x1f350;七…

【玩转 Cloud Studio】腾讯Cloud Studio 云端开发环境上手体验

目录 1、Cloud Studio简介 2、功能体验 3、Cloud Studio优点 4、总结 1、Cloud Studio简介 Cloud Studio&#xff08;云端 IDE&#xff09;是基于浏览器的集成式开发环境&#xff0c;为开发者提供了一个稳定快速的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;只…

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…

VS+Qt — Vistual Studio 2022+Qt6安装教程以及解决Qt Vistual Studio Tools下载慢和VS无法打开.ui进行设计的问题

目录 Vistual Studio 2022下载 Qt下载 Qt Vistual Studio Tools下载 方法1 方法2 方法3 方法4 Vistual Studio 2022配置Qt6 创建Qt项目 若VS无法打开.ui进行设计 Vistual Studio 2022下载 以前因为安装库的关系&#xff0c;已经下载过VS2022了&#xff0c;详细请看这…

C++ 学习 ::【基础篇:05】:C++ 函数重载认识及使用、简单介绍:C++ 支持函数重载的原因

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

CSS之基础扫盲

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 二、CSS基础语法 2.1 CSS引入方式 2.1.1 内部样式 2.1.2 外部样式 2.1.3 内联样式 2.2 CSS选择器 2.2.1 标签选择器 2.2.2 类选择器 2.2.3 id选择器 2.2.4 通配符选择器 2.2…

HNU-操作系统OS-实验Lab7

OS_Lab7_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 实验目的 理解操作系统的同步互斥的设计实现;理解底层支撑技术:禁用中断、定时器、等待队列;在ucore中理解信号量(semaphore)机制的具体实现;理解管程机制,在ucore内…

动力电池管理系统(BMS)

BMS技术 目录 BMS技术 一、BMS简介 二、BMS主要功能 1、参数检测 2、剩余电量&#xff08;SOC&#xff09;估计 3、充放电控制 4、热管理 5、均衡控制 6、故障诊断 7、信息监控 8、参数标定 9、CAN总线接口 三、BMS架构组成 1、BMS的拓扑架构 1、1集中式架构的B…

JavaEE进阶(5/27)Spring Boot

目录 1.认识Spring Boot 2.Spring Boot的优点 3.SpringBoot项目创建 4.resource文件夹 和test文件夹 5.使用一个Spring Boot项目 1.认识Spring Boot Spring Boot 中的Boot 是启动引导的意思 如果Spring相比于普通java开发是从走演变到了汽车&#xff0c;那么Spring boot 相比…