Vue 前后端交互基础


在这里插入图片描述




1.1 了解前后端分离

1.1.1 前后端不分离

  在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。这种应用模式比较适合纯网页应用,但是当后端对接 App 时,App 可能并不需要后端返回一个 HTML 网页,而仅仅是数据本身,所以后端原本返回网页的接口不再适用于前端 App 应用,为了对接 App 后端还需再开发一套接口。

在这里插入图片描述

1.1.2 前后端分离

  在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染 HTML 页面,不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页的处理方式,App 有 App 的处理方式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者 API,前端通过访问接口来对数据进行增删改查。

在这里插入图片描述





1.2 Promise

1.2.1 Promise 简介

  ES 6 中为我们提供了 Promise 异步编程解决方案,比传统的解决方案“回调函数和事件”更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。Promise对象有以下两个特点。
  ♞ 对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
  ♞ 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。

1.2.2 Promise 的使用

☞ 语法

var p = new Pormise(function(resolve, reject) {
	// 这里实现异步调用
	
	// 调用成功
	resolve("success");
	
	// 调用失败
	reject("error");
});

p.then(function(data) {
	// 成功的情况
},function(info) {
	// 失败的情况
});

  Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 和 reject。它们是两个函数,由 JavaScript 提供,不用自己定义。resolve 函数的作用是,将 Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject 函数的作用是,将 Promise 对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
  Promise实例生成以后,可以用 then 方法分别指定 resolved 状态和 rejected 状态的回调函数。then 方法可以接受两个回调函数作为参数。第一个回调函数是 Promise 对象的状态变为 resolved 时调用,第二个回调函数是 Promise 对象的状态变为 rejected 时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 Promise 对象传出的值作为参数。注意:Promise 新建后就会立即执行。

☞ 示例

  此处将采用 XMLHttpRequest 进行请求,对于 XMLHttpRequest 不了解的可以移步 《来看一下原生 XMLHttpRequest 是怎么请求数据的》

let promise = new Promise(function (resolve, reject) {
    // 获取与后台交换数据的对象 XMLHttpRequest
    var xhr = new XMLHttpRequest();

    /*
        - readyState 改变时触发 onreadystatechange 事件
        - readyState: XMLHttp 请求的当前状态
            0: 请求未初始化
            1: 服务器连接已建立
            2: 请求已接收
            3: 请求处理中
            4: 请求已完成,且响应已就绪
        - status:响应状态码
            200: "OK"
            404: 未找到页面
    */
    xhr.onreadystatechange =  function() {
        if(xhr.readyState != 4) {
            return ;
        }

        if(xhr.readyState == 4 && xhr.status == 200) {
            // 请求成功的情况,通过 responseText 属性来获取由服务器返回的数据
            resolve(xhr.responseText);
        } else {
            // 处理请求失败
            reject("请求失败");
        }
    }

    /*
        初始化一个请求
        open(method, url, async, username, password)
            method: 请求方式
            url: 请求的地址
            async: 请求是否异步,默认异步
            userrname、password: 可选,为 url 的授权提供认证
    */
    xhr.open("get", "url");

    /*
        发送 http 请求
        send(参数可选)
            null: 代表只有 url 没有数据体。例如:get 请求
            数据体:除了请求头信息还包含具体数据的数据体。例如:post请求
    */
    xhr.send(null);
});

promise.then(function (data) {
    alert(data);
},function (info) {
    alert(info)
})

在这里插入图片描述
在这里插入图片描述

1.2.3 Promise 其他方法

☞ 实例方法
then(方法 1, 方法 2):方法 1 处理异步正常的数据,方法 2 处理异步失败(可以不写)
catch(方法):处理异步失败,与 .then 的方法 2 效果一致
finally(方法):无论如何最后都会执行的方法

☞ 静态方法
all(数组):接收一个数组,每个数组元素都是一个 Promise 实例,当这个数组中的 Promise 实例全部返回时,方法执行结束
race(数组): 接收一个数组,每个数组元素都是一个 Promise 实例,当这个数组中的 Promise 实例有一个返回时,方法执行结束





1.3 Fetch

1.3.1 Fetch 简介

  页面中需要向服务器请求数据时,基本上都会使用 Ajax 来实现。Ajax 的本质是使用 XMLHttpRequest 对象来请求数据,而 XMLHttpRequest 对象是通过事件的模式来实现返回数据的处理。与 XMLHttpRequest 类似,Fetch 是新的 Ajax 的解决方案,会返回一个 Promise。Fetch 不是 Ajax 的进一步封装,而是原生 JS ,没有使用 XMLHttpRequest。

在这里插入图片描述


1.3.2 Fetch 的使用

☞ 语法

// fetch 参数为请求的路径,默认为 get 请求
fetch("url").then(function(data) {  
		// 成功返回的 data 是一个 Promise 实例,不能直接拿到数据
		// 需要使用 fetch 的方法 text() 取出数据
		return data.text();
	},function(info) { 
		// 失败返回的 info 我们可以直接拿到数据
	}
);

  fetch 有两个参数,第一个是 url 是必须要填写的,第二个是 option 是可选的,option 用来设置如 method(GET,POST,PUT,DELETE,HEAD)、headers(对应的 Headers 对象) 、body(请求参数)等信息。fetch 方法的 then 会接收一个 Response 实例,值得注意的是 fetch 方法返回的 data 是一个 Promise 实例,不能直接拿到数据。可以使用 data.json():将返回的数据转为 json,data.text():将返回数据转为字符串

☞ 示例

fetch('url', {
   method: 'GET',
}).then((data) => {
   console.log(data.json());
},(info) => {
   console.log(info);
});

在这里插入图片描述





1.4 axios

1.4.1 axios 简介

  axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR的封装。axios是Promise的实现版本,符合最新的ES规范,它本身具有以下特征:
 ♞ 从浏览器中创建 XMLHttpRequests
 ♞ 从 node.js 创建 http 请求
 ♞ 支持 Promise API
 ♞ 拦截请求和响应
 ♞ 转换请求数据和响应数据
 ♞ 取消请求
 ♞ 自动转换 JSON 数据
 ♞ 客户端支持防御 XSRF

1.4.2 axios 的使用

☞ 安装

# npm 安装
npm install axios

# 使用 cdn
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

☞ 语法

axios({
  method: 'get',
  url: 'url',
  params: {}  // 参数,post、put 使用 data
})
.then(function (response) {
	console.log(response);
})
.catch(function (error) {
	console.log(error);
});

☞ 示例

<template>
    <button @click="fun">请求</button>
</template>

<style scoped>
</style>

<script>
    import axios from 'axios'

    export default {
        data() {
            return {}
        },
        methods: {
            fun() {
                axios({
                    method: 'get',
                    url: 'http://api.k780.com',
                    params: {
                        app: 'weather.today',
                        weaid: 1,
                        appkey: 10003,
                        sign: 'b59bc3ef6191eb9f747dd4e83c99f2a4',
                        format: 'json'
                    },
                }).then(function (response) {
                    alert(JSON.stringify(response.data))
                }).catch(function (error) {
                    alert(error);
                });
            }
        },
    }
</script>

在这里插入图片描述

☞ 请求别名
axios.request(config)
axios.get(url,[config])
axios.delete(url,[config])
axios.head(url,[config])
axios.options(url,[config])
axios.post(url,[data],[config])
axios.put(url,[data],[config])
axios.patch(url,[data],[config])

1.4.3 axios 全局配置

// 配置公共的请求头,配置之后再 url 中可以省略公共的请求头 
axios.defaults.baseURL = 'http://localhost/test';

// 配置超时时间 
axios.defaults.timeout = 3000;

// 配置公共的 post 的 Content-Type 
axios.defaults.headers.post['Content-Type'] = 'application/json';

1.4.4 axios 拦截器

☞ 请求拦截器

axios.interceptors.request.use(function(config) {
	// 任何请求都会经过这里
	console.log(config.url)
	// 必须要 return 否则配置不成功
	return config;
}, function(error){ 
	// 处理错误请求 
	console.log(error)
});

☞ 响应拦截器

axios.interceptors.response.use(function(res) {
	// 处理响应
	return res.data;
}, function(error){ 
	// 处理错误响应 
	console.log(error)
});
### Spring与Vue实现前后端分离交互的方法 #### 一、技术栈概述 Spring Boot 和 Vue 是目前非常流行的后端框架和前端框架组合之一。通过 Axios 库可以轻松完成前后端的数据交互[^1]。 --- #### 二、Axios 的安装与配置 为了简化 HTTP 请求操作,通常会在 Vue 项目中集成 Axios 来处理 API 调用。以下是 Axios 的安装方法以及如何将其封装以便于管理: 1. **安装 Axios** 使用 npm 或 yarn 安装 Axios 及其 Vue 插件 `vue-axios`: ```bash npm install --save axios vue-axios ``` 2. **在 main.js 中引入并注册 Axios** 将 Axios 集成到 Vue 项目中,并设置基础路径(可选),便于统一管理接口地址。 ```javascript import Vue from 'vue'; import axios from 'axios'; import VueAxios from 'vue-axios'; // 设置默认的基础 URL axios.defaults.baseURL = 'http://localhost:8080/api/'; // 注册 VueAxios Vue.use(VueAxios, axios); ``` 3. **封装 Request 请求** 创建一个独立的请求模块来集中管理所有的网络请求逻辑。例如,在 `src/utils/request.js` 文件中定义如下内容: ```javascript import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000, }); // 添加请求拦截器 service.interceptors.request.use( config => { // 在发送请求之前做些什么,比如添加 token 到 headers if (localStorage.token) { config.headers['Authorization'] = localStorage.token; } return config; }, error => Promise.reject(error) ); // 添加响应拦截器 service.interceptors.response.use( response => response.data, error => Promise.reject(error) ); export default service; ``` --- #### 三、Spring Boot 后端服务设计 Spring Boot 提供了强大的 RESTful 接口支持能力,可以通过控制器类接收来自前端的请求参数并返回 JSON 数据给客户端。 1. **创建 Controller 类** 下面是一个简单的学生信息新增接口示例: ```java @RestController public class StudentController { @PostMapping("/addStudent") public ResponseEntity<String> addStu(@RequestBody Student student){ System.out.println("接收到的学生数据:" + student.getName()); return new ResponseEntity<>("Success", HttpStatus.OK); } static class Student{ private String name; // Getter and Setter methods public String getName() {return this.name;} public void setName(String name) {this.name = name;} } } ``` 2. **跨域问题解决** 如果前后端部署在同一台服务器下,则无需额外考虑 CORS;但如果分开部署,则需启用跨域资源共享机制。可以在全局范围内开启跨域支持或者针对特定接口单独允许访问: ```java @CrossOrigin(origins = "http://localhost:8081") // 替换为实际前端域名 @RestController public class SomeOtherController {} ``` --- #### 四、前后端联调测试 当双方都准备好之后就可以开始联合调试工作流程了。 1. **发起 GET/POST 请求** 假设我们想向 `/api/addStudent` 发送 POST 请求提交表单数据,那么对应的 Vue 方法可能看起来像这样: ```javascript submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { this.$axios.post('/addStudent', { name: this.studentName }).then(response => { console.log('成功:', response.message); }).catch(err => { console.error('失败:', err); }); } else { console.warn('验证未通过'); return false; } }); } ``` 2. **页面渲染展示结果** 结合 Element UI 组件库快速构建美观易用的界面效果[^4]。例如显示一条消息提示框告知用户操作状态变化情况: ```javascript this.$message.success('保存成功!'); ``` --- #### 总结 以上就是关于如何利用 Spring Boot 和 Vue 构建一套完整的前后端分离架构体系的过程介绍。重点在于合理规划好各自的职责范围并通过标准化协议进行高效沟通交流[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值