「Web开发-Vue」 AJAX

Posted by Dawn-K's Blog on July 7, 2020

AJAX

不是一种新的编程语言, 是一种异步通信技术. 在无需重新加载网页的情况下, 就可以更新部分网页.

但是原生的比较弱, 我们这里就用Vue中封装好的Ajax, 其可以提供一个拦截器.

使用

要先启动java项目, 并先用postman调试好, 然后进行测试. 可以在浏览器的调试工具中看到和postman中看到的相同的结果.

简单使用

在Login.vue中Login()的函数中直接编写调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 下面这行写在<script>开头
import axois from "axios";

login() {
    // 也就是说可以双向改变
    // console.log(this.username);
    // this.username = "test";

    axois.get("http://localhost:8888/user/all").then(response => {
        console.log(response.data);
    });
    if (this.username == "admin" && this.password == "1234") {
        console.log("登录成功");
        // 引用 main.js中import的文件
        this.$router.push(`/home`);
    } else {
        console.log("登录失败");
    }
}

进阶

新建request.js文件, 将Url配置, 拦截器(令牌校验, 错误跳转)进行封装., 然后在Login.vue中编写request调用.

// src/utils/request.js
import axios from 'axios'
import {
    getToken,
    setToken,
    removeToken
} from '@/utils/localStorage.js'
// 创建axios实例
const service = axios.create({
    baseURL: 'http://localhost:8888', // api的base_url
    timeout: 5000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => {
    console.log("请求拦截");
    // 统一加上令牌
    if (getToken() !== "") {
        config.headers.token = getToken();
    }
    return config
}, error => {
    return Promise.reject(error);
})

// respone拦截器
service.interceptors.response.use(
    response => {
        console.log(response);
        console.log("响应拦截");
        // 没有token跳转到登录

        // 跨域问题
        if (response.data.code == 4) {
            window.location.href = "/";
            return;
        }

        return response;
    }, error => {
        console.log(error);
        return Promise.reject(error.response.data)
    })

export default service
// src/views/Login.vue
import request from "@/utils/request.js";
// 无用的部分在此没有写出
login() {
    // 复用性较差,对于获取所有人的信息,可能会造成代码的冗余
    // 所以创建src/api文件用以提高复用性
    request({
        // 和request中的service拼接路径
        url: "/user/all",
        method: "get"
    }).then(response => {
        console.log(response.data);
    });
}

api方式

保留上个方法中的request.js 新建api文件夹, 中间存放user.js. 将request的设置也一并封装成js函数, 在vue文件中直接调用函数.

此处一定要注意, 这里一定要写 data:data 这种形式, 后一个data表示数据的参数, 前者表示类型, 如果前者为 params , 则为路径形式的传参

// src/api/user.js
import request from "@/utils/request.js";

// 可以和后端代码不那么严丝合缝的对应
// 获取所用用户数据
const basePath = "/user"
// 添加用户
export function insert(data) {
    return request({
        url: basePath,
        method: "post",
        data: data
    });
}

// 修改用户
export function update(data) {
    return request({
        url: basePath,
        method: "put",
        data: data
    });
}
// 删除用户
export function deleteElem(ids) {
    return request({
        url: basePath,
        method: "delete",
        data: ids
    });
}

// 获取分页信息
export function getPage(data) {
    return request({
        url: basePath + "/query",
        method: "post",
        data: data
    });
}

// 获取所有用户信息
export function getAll() {
    return request({
        url: basePath + "/all",
        method: "get",
    });
}
import {
    getUsers
} from "@/api/user.js";

// 无用的部分在此没有写出
login() {
    // 复用性较差,对于获取所有人的信息,可能会造成代码的冗余
    // 所以创建src/api文件用以提高复用性
    getUsers().then(response => {
        console.log(response.data);
    });
}

操作每行数据

参考资料

跨域错误

跨域访问(CORS)是由于浏览器的保护机制引起的. 最开始的解决方案是: 在UserController.java(这个就是View层的控制器, 用以映射url与业务层接口)上加入@CrossOrigin以允许跨域. 但是并不是完善的解决方案. 最好如下操作.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// src\main\java\com\neuedu\config\GlobalCorsConfig.java
// 过滤器
@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }
}