axiso 怎么读?

[æk’siəʊ:s] Chinglish:艾克瑟斯/艾克丝伊欧姿

释义

默认情况下,我们项目中并没有对axios包的支持,所以我们需要下载安装。

在项目根目录中使用npm安装包

1
2
npm install axios
yarn add axios

axios/axios: Promise based HTTP client for the browser and node.js (github.com)

也可以直接下载min.js版本通过script标签导入

接着在main.js文件中,导入axios并把axios对象挂载到vue属性中多为一个子对象,这样我们才能在组件中使用。

而vue3好像还需要下载一个vue-axios包。

为什么我这么讲呢?因为我并不全局使用啊,封装成一个js文件,每次使用时引用即可。额,我也没有使用过。不过在网上冲浪看到我也提一句吧~
1
npm i axios vue-axios --save
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import axios from 'axios'
import VueAxios from 'vue-axios'

const app = createApp(App)

app.use(VueAxios, axios).use(router)
//然而只是这样全局并不能用;
app.provide('axios', app.config.globalProperties.axios)
//这句不写, 组件里无法注入全局axios, 也就无法使用

app.mount('#app')

参考文章:Vue3 中使用 “vue-axios“_vue-axios vue3_白瑕的博客-CSDN博客

或者把axios分装成一个单独的js文件,调用时导入即可

我们在src目录下新建一个http.js 导入axios并通过create方法实例化一个http请求对象,这样我们才能在组件中使用

1
2
3
4
5
6
7
8
9
import axios from "axios";  //要导入安装的包,则直接填写包名即可
//创建实例
const httptool = axios.create({
baseURL: 'http://127.0.0.1:8000/',//请求的公共路径,一般填写服务器api地址
timeout: 1000, //最大请求超时时间,请求超过这个时间就报错
headers: {'X-Custom-Header': 'foobar'} //预设的请求头,一般工作当中这里填写隐藏了客户端身份字段
});
export default httptool;

在组件中使用axios获取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<script>
import Menu from "@/components/Menu.vue";
import httptool from "@/http";

export default {
name: "Register_page"//不能使用Register
,
methods: {
send() {
// httptool.get("请求地址",)
// http://127.0.0.1:8000/sers/gensetview/?id=1
// http://127.0.0.1:8000/填写在http.js中的BaseURL
// sers/gensetview/ 填写在axios的http请求方法的第一个参数里面,与BaseURL拼接成一个完整的URL
httptool.get("sers/gensetview/1", {
params: {
id: '1',
}, //查询字符串
headers: {"Company": "Vue Company"},//自定义请求头
}).then(response => {//回调函数
console.log(response);
console.log(response.data);//http响应的请求体数据
console.log(response.data.data);//http响应的请求体数据[.data.data是表示对分提供的data还有一层data,这个data是服务端定义的不是每次都有]
}
).catch(error=>{//捕获并打印异常
console.log(error) //可以是本地的错误信息也可以是服务端的错误信息
console.log(error.response) //接收来自服务端的响应错误,如果服务端没有错误,则没有response属性
})
// const { data: res } = this.http.get('/sers/gensetview/1')
// console.log(res)
}
},
components: {
Menu
},
}

</script>

<template>
<h1>这是Register3页面</h1>
<Menu></Menu>
<button @click="send">点击发送请求</button>
</template>

<style scoped>

</style>

使用的时候,因为本质上来说,我们使用axios发起http请求,本质上是javascript提供的ajax,所以也会收到和普通的javascript同源策略的影响。

解决跨域问题

一、后端

官方文档(超详细):Django-cors-headers ·皮皮 (pypi.org)

1.安装

在后端Django项目中安装django-cors-headers

1
pip install django-cors-headers
2.注册app
1
2
3
4
5
INSTALLED_APPS = [
...,
"corsheaders",
...,
]
3.添加一个中间件类来侦听响应:
1
2
3
4
5
6
MIDDLEWARE = [
...,
"corsheaders.middleware.CorsMiddleware",
"django.middleware.common.CommonMiddleware",
...,
]
4.配置CORS_ALLOWED_ORIGINS:

指的是允许访问的客户端

1
2
3
4
5
6
CORS_ALLOWED_ORIGINS = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000",
]

可以是本地也可以是其他的url

甚至可以使用通配符*表示同意任何客户端访问,在这里写作"*"

5.配置CORS_ALLOW_HEADERS
1
2
3
CORS_ALLOW_HEADERS =[
"*"
]

这里的Post请求的data参数写错了多了一个{},

其他配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CORS_ALLOW_HEADERS = [
"Accept",
"Accept-Encoding",
"Authorization",
"Content-Type",
"Cookie",
"DNT",
"X-CustomHeader",
"Keep-Alive",
"User-Agent",
"X-Requested-With",
]
CORS_ALLOW_METHODS = [
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = [
"http://127.0.0.1:5173",
"http://localhost:5173",
]

##src/View/Robot.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script>
import httptool from "@/http";

export default {
name: "chatRobot",
data() {
return {
message: ''
}
},
methods: {
send() {
//发起请求
const data = {
"name": this.message,
"age": '18'
}
httptool.post('sers/gensetview/', data).then(res => {
console.log(res.data);
console.log(res);
}).catch(error => {
console.log(error);
console.log((error.response));
})
}
}
}
</script>

<template>
<input type="text" v-model="message">
<button @click="send">发送请求</button>
</template>

<style scoped>

</style>

数据库中被添加了对应的值

Get请求也没有问题了

常用的axios请求方法

在工作中,我们基本都是通过axios来发起http请求来读取或者上传数据到服务端的。

axios针对http即请求提供了多个不同的请求方法。根据是否有请求体,写法上可以分2类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//get、delete、head、options	用法参数一致
axios.get('url地址',{ //url地址如果没有加上协议,则axios会自动根据实例化的baseURL参数自动拼接。
parms:{
"":"", //键值对,查询字符串 地址栏?号后面信息
},
header:{
"":"", //键值对,自定义请求头
}

}).then({response=>{
//请求成功时,可以通过response.data来获取服务端的请求体数据
}}).catch(error=>{
//异常发生时会自动调用这里的代码,同时第一个参数表示异常对象
//error.response;/获取来自服务端的异常信息,如果服务端没有异常,则response的值为undefind
})
//post,put,patch 用法参数一致
axios.get('url地址',{
"":"", //键值对,请求体数据
},{
header:{
"":"", //键值对,自定义请求头
}}

).then({response=>{
//请求成功时,可以通过response.data来获取服务端的请求体数据
}}).catch(error=>{
//异常发生时会自动调用这里的代码,同时第一个参数表示异常对象
//error.response;/获取来自服务端的异常信息,如果服务端没有异常,则response的值为undefind
})
1
2
3
4
5
6
7
8
9
10
//实例方法
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]])
axios##getUri([config])

同源策略以及解决方案

所谓的同源策略,实际上是浏览器内部提供的一个为了保护用户在服务端的数据而提供的一种安全机制。同源策略的作用主要是为了限制javascript在非法的客户端下执行的一种安全策略。

所谓的同源,实际上就是把客户端的请求u地址与服务端的请求u地址进行协议,域名P),端口三者的比较,如果三者一致,则表示双方同源,否则任意一个位置不一致则表示不同源。

因为同源策略的问题,所以我们一般情况下只要使用了ajax进行服务端的数据的操作都会面临着同源策略的拦截和影响。一般在开发中这个问题,我们也叫ajax的跨域(跨源)问题。

所谓的跨域实际是就是让我们的javascript在基于与服务端不同源的客户端下正常运行。

1
127.0.0.1/:1  Access to XMLHttpRequest at 'http://127.0.0.1:8000/sers/gensetview/' from origin 'http://127.0.0.1:8080' has been blocked by CORS policy: Request header field x-custom-header is not allowed by Access-Control-Allow-Headers in preflight response.

在工作中,跨域的解决方案一般无非以下三种:

  1. cors方案 ,W3C维护的一个跨资源共享的协议。这个协议要求服务端通过响应头的方式高数服务端是否允许访问

  2. 服务端代理(Proxy Server),自己搭建一个可控的代理服务端(自己的服务端项目),因为同源策略只存在于览器,所以我们让客户端直接请求代理服务器,然后代理服务器接收客户端请求以后,执行代码请求目标服务端边获取到客户端需要的数据

  1. jsonp方案,原则上来说是利用HTML中的某些默认能跨域的标签来实现。script,link,src,iframe,…

axios拦截器

类似中间件或钩子的一个代码段。
栏截器的作用:在使用axiosi进行htp请求和响应处理过程中,编写一些公共代码的,公共的代码提示,公共的错误处理
甚至包括,页面跳转(动画),权限判断…

官方示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});

// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Any status code that lie within the range of 2xx cause this function to trigger
// Do something with response data
return response;
}, function (error) {
// Any status codes that falls outside the range of 2xx cause this function to trigger
// Do something with response error
return Promise.reject(error);
});

在我们封装的http组件中继续添加拦截器的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import axios from "axios";  //要导入安装的包,则直接填写包名即可
//创建实例
const httptool = axios.create({
baseURL: 'http://127.0.0.1:8000/',//请求的公共路径,一般填写服务器api地址
timeout: 1000, //最大请求超时时间,请求超过这个时间就报错
headers: {'X-Custom-Header': 'foobar'} //预设的请求头,一般工作当中这里填写隐藏了客户端身份字段
});
// 添加请求拦截器
httptool.interceptors.request.use(function (config) {
// Do something before request is sent
console.log('config')
console.log(config)
console.log("Http请求之前")
return config;
}, function (error) {
// Do something with request error
console.log("Http请求错误")
return Promise.reject(error);
});

// 添加响应拦截器
httptool.interceptors.response.use(function (response) {
// Any status code that lie within the range of 2xx cause this function to trigger
// Do something with response data
console.log('response')
console.log(response)
console.log("Http响应之前")
return response;
}, function (error) {
// Any status codes that falls outside the range of 2xx cause this function to trigger
// Do something with response error
console.log("Http响应错误")
return Promise.reject(error);
});

export default httptool;

Register.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script>
import Menu from "@/components/Menu.vue";
import httptool from "@/http";

export default {
name: "Register_page",//不能使用Register
methods: {
send() {
httptool.get("sers/gensetview/1", {
params: {
id: '1',
}, //查询字符串
headers: {"Company": "Vue Company"},//自定义请求头
}).then(response => {//回调函数
console.log("返回数据response");
console.log(response);
console.log("返回数据response.data");
console.log(response.data);//http响应的请求体数据
console.log("返回数据response.data.data");
console.log(response.data.data);//http响应的请求体数据[.data.data是表示对分提供的data还有一层data,这个data是服务端定义的不是每次都有]
}
).catch(error=>{//捕获并打印异常
console.log(error) //可以是本地的错误信息也可以是服务端的错误信息
console.log(error.response) //接收来自服务端的响应错误,如果服务端没有错误,则没有response属性
})
}
},
components: {
Menu
},
}

</script>

<template>
<h1>这是Register3页面</h1>
<Menu></Menu>
<button @click="send">点击发送GET/1请求</button>
</template>

设置一般的http请求头

auth的token封装如何封装?

1
2
3
4
5
6
7
8
9
10
11
service.interceptors.request.use(
(config) => {
const token = useAuthStore().token
if (token)
config.headers.Authorization = `Bearer ${token}`
return config
},
(error) => {
return Promise.reject(error.response)
},
)

这里的service就是创建的axios实例


本破站由 @BXZDYG 使用 Stellar 主题创建。
本博客部分素材来源于网络,如有侵权请联系1476341845@qq.com删除
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本"页面"访问 次 | 👀总访问 次 | 总访客
全部都是博主用心学编写的啊!不是ai啊 只要保留原作者姓名并在基于原作创作的新作品适用同类型的许可协议,即可基于非商业目的对原作重新编排、改编或者再创作。