|
@@ -0,0 +1,168 @@
|
|
|
+### 请求后端
|
|
|
+
|
|
|
+#### axios
|
|
|
+
|
|
|
+文档:https://www.axios-http.cn/docs/intro
|
|
|
+
|
|
|
+#### 安装
|
|
|
+
|
|
|
+```powershell
|
|
|
+npm install axios
|
|
|
+```
|
|
|
+
|
|
|
+#### 请求
|
|
|
+
|
|
|
+```js
|
|
|
+import axios from "axios";
|
|
|
+axios.post('/user', {
|
|
|
+ firstName: 'Fred',
|
|
|
+ lastName: 'Flintstone'
|
|
|
+})
|
|
|
+.then(function (response) {
|
|
|
+ console.log(response);
|
|
|
+})
|
|
|
+.catch(function (error) {
|
|
|
+ console.log(error);
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+#### 封装请求
|
|
|
+
|
|
|
+**utils/request.js**
|
|
|
+
|
|
|
+```js
|
|
|
+import axios from "axios";
|
|
|
+import { MessageBox, Message } from "element-ui";
|
|
|
+const request = axios.create({
|
|
|
+ baseURL: "/api", //请求的url
|
|
|
+ timeout: 10000, // 请求超时
|
|
|
+ withCredentials: false, //跨域请求是否需要携带 cookie
|
|
|
+});
|
|
|
+function getToken() {
|
|
|
+ //获取token, token可以放在store, 也可以放在sessionStorage或localStorage
|
|
|
+ const token = sessionStorage.getItem("token") || "";
|
|
|
+ return token;
|
|
|
+}
|
|
|
+
|
|
|
+request.interceptors.request.use(
|
|
|
+ function (config) {
|
|
|
+ // 在发送请求之前做些什么
|
|
|
+ // 请求接口统一添加token
|
|
|
+ config.headers["Authorization"] = "Bearer " + getToken();
|
|
|
+ return config;
|
|
|
+ },
|
|
|
+ function (error) {
|
|
|
+ // 对请求错误做些什么
|
|
|
+ return Promise.reject(error);
|
|
|
+ }
|
|
|
+);
|
|
|
+
|
|
|
+// 添加响应拦截器
|
|
|
+request.interceptors.response.use(
|
|
|
+ function (response) {
|
|
|
+ // 2xx 范围内的状态码都会触发该函数。
|
|
|
+ // 对响应数据做点什么
|
|
|
+ // 后端返回格式 定义:
|
|
|
+ // {
|
|
|
+ // data,
|
|
|
+ // message,
|
|
|
+ // code
|
|
|
+ // }
|
|
|
+ const code = response.data.code;
|
|
|
+ const msg = response.data.message;
|
|
|
+ // 当状态码不等于200时,请求数据有问题
|
|
|
+ if (code === 401) {
|
|
|
+ // 比如设置401:登录过期
|
|
|
+ MessageBox.confirm(
|
|
|
+ "登录状态过期,您可以继续留在该界面,或重新登录",
|
|
|
+ "系统提示",
|
|
|
+ {
|
|
|
+ confirmButtonText: "重新登录",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ }
|
|
|
+ ).then(() => {
|
|
|
+ //跳转至登录页面
|
|
|
+ });
|
|
|
+ } else if (code === 500) {
|
|
|
+ Message({ message: msg, type: "error" });
|
|
|
+ return Promise.reject(new Error(msg));
|
|
|
+ } else {
|
|
|
+ // 当状态码等于200时,说明成功
|
|
|
+ return response.data.data;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ function (error) {
|
|
|
+ // 超出 2xx 范围的状态码都会触发该函数。
|
|
|
+ // 对响应错误做点什么
|
|
|
+ Message({ message: error, type: "error", duration: 5 * 1000 });
|
|
|
+ return Promise.reject(error);
|
|
|
+ }
|
|
|
+);
|
|
|
+
|
|
|
+export default request;
|
|
|
+```
|
|
|
+**api/user.js**
|
|
|
+
|
|
|
+```js
|
|
|
+import request from "@/utils/request";
|
|
|
+export function getUserInfo() {
|
|
|
+ return request({
|
|
|
+ url: "/getInfo",
|
|
|
+ method: "get",
|
|
|
+ params: {
|
|
|
+ id: "1111"
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+export function changePwd() {
|
|
|
+ return request({
|
|
|
+ url: "/changePwd",
|
|
|
+ method: "post",
|
|
|
+ data: {
|
|
|
+ id: "1111"
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+```
|
|
|
+**Vue页面**
|
|
|
+
|
|
|
+```js
|
|
|
+import { getUserInfo } from "@/api/user";
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ name: 11,
|
|
|
+ };
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ getUserInfo().then((res) => {
|
|
|
+ console.log(res);
|
|
|
+ });
|
|
|
+ },
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+#### 跨域问题
|
|
|
+**vue.config.js**
|
|
|
+
|
|
|
+```js
|
|
|
+const { defineConfig } = require("@vue/cli-service");
|
|
|
+module.exports = defineConfig({
|
|
|
+ transpileDependencies: true,
|
|
|
+ devServer: {
|
|
|
+ port: 9091,
|
|
|
+ open: true,
|
|
|
+ proxy: {
|
|
|
+ "/api": {
|
|
|
+ target: `http://localhost:9090`,//实际请求的后端地址
|
|
|
+ changeOrigin: true,
|
|
|
+ pathRewrite: {
|
|
|
+ "/api": "",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|