Vue全家桶之Vue中的ajax(五)

Vue全家桶之Vue中的ajax(五)

一 Ajax的跨域问题

1.1 问题引入

由于浏览器存在同源策略的限制,当浏览器页面尝试向非同源的地址发送ajax请求时,就会发生跨域的问题。比如浏览器页面地址为http://localhost/8080,ajax请求地址为http://localhost/5000,由于端口号不同,非同源,所以会发生跨域的错误。

1.2 几个概念

根据上面的问题描述,关于跨域,有几个概念,需要了解一下。

概念描述
同源如果两个页面(接口)的协议、域名、端口号都相同,我们认为他们具有相同的源
同源策略同源策略就是浏览器的一个安全限制,它阻止了不同【域】之间进行的数据交互
跨域当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

1.3 解决Ajax跨域的方法

通常情况下,解决Ajax跨域有以下三种方式。

  • JSONP方式(只支持get请求,不支持post请求)
  • CORS方式(跨源 AJAX 请求的根本解决方法。)
  • 代理请求方式(借助同源的代理服务器进行转发,可以通过nginx或vue脚手架实现)

代理服务器图示
本文重点介绍vue脚手架通过配置代理解决Ajax跨域问题。

二 vue脚手架配置代理

方法一

​ 在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': ''}
      },
      '/api2': {// 匹配所有以 '/api2'开头的请求路径
        target: 'http://localhost:5001',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api2': ''}
      }
    }
  }
}
/*
   changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
   changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080
   changeOrigin默认值为true
*/

说明:

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

三 实际案例

接下来介绍一个简单的Ajax跨域案例,就是开头提到过的问题,地址为http://localhost/8080的页面,向地址为http://localhost/5000的服务器发生Ajax请求。

先给出服务器server1.js的代码

const express = require('express')
const app = express()

app.use((request,response,next)=>{
	console.log('有人请求服务器1了');
	// console.log('请求来自于',request.get('Host'));
	// console.log('请求的地址',request.url);
	next()
})

app.get('/students',(request,response)=>{
	const students = [
		{id:'001',name:'tom',age:18},
		{id:'002',name:'jerry',age:19},
		{id:'003',name:'tony',age:120},
	]
	response.send(students)
})

app.listen(5000,(err)=>{
	if(!err) console.log('服务器1启动成功了,请求学生信息地址为:http://localhost:5000/students');
})

在DOS窗口启动服务器1

开启server1

在Vue.config.js中进行配置

module.exports = {
  pages: {
    index: {
      //入口
      entry: 'src/main.js',
    },
  },
	lintOnSave:false, //关闭语法检查
	//开启代理服务器(方式一)
	/* devServer: {
    proxy: 'http://localhost:5000'
  }, */
	//开启代理服务器(方式二)
	devServer: {
    proxy: {
      '/atguigu': {
        target: 'http://localhost:5000',
	    pathRewrite:{'^/atguigu':''},
        // ws: true, //用于支持websocket
        // changeOrigin: true //用于控制请求头中的host值
      }
    }
  }
}

App.vue代码

备注:常用的发生ajax请求有传统的XHR、jQuery、axios(vue目前官方推荐)、fetch、vue-resource(Vue1.0广泛使用),所以在vue中,经常使用axios去发送请求。

<template>
	<div>
		<button @click="getStudents">获取学生信息</button>
	</div>
</template>

<script>
	import axios from 'axios'
	export default {
		name:'App',
		methods: {
			getStudents(){
                
				axios.get('http://localhost:8080/atguigu/students').then(
					response => {
						console.log('请求成功了',response.data)
					},
					error => {
						console.log('请求失败了',error.message)
					}
				)
			}
		},
	}
</script>

执行npm run serve,打开页面查看结果

跨域请求结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值