一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
前言
大家好呀,我是L同学。上篇文章中react基础(十六)— styled-components,我们学习了CSS-in-JS中流行的styled-components的基本使用。今天,我们学习下axios,如何发送网络请求。
axios介绍
我们在进行开发时,需要跟服务器打交道。在前端进行网络请求最常用的方案是使用axios。axios是目前前端使用非常广泛的网络请求库。axios的主要特点是在浏览器中发送XMLHttpRequest请求、在node.js中发送http请求、支持Promise API、拦截请求和响应、转换请求和相应数据等等。
axios的基本使用
axios支持多种请求方式,包括:
- axios(config)
- axios.request(config)
- axios.get(url[, config])
- axios.delete(url[, config])
- axios.head(url[, config])
- axios.post(url[, data[, config]])
- axios.put(url[, data[, config]])
- axios.patch(url[, data[, config]])
在开发中,我们在componentDidMount生命周期中拿到数据后进行进行更新。
import { PureComponent } from "react";
export default class App extends PureComponent {
constructor(props) {
super(props)
this.state = {
products: []
}
}
componentDidMount() {
this.setState({
products: [...this.state.products, ...res]
})
}
render() {
return (
<div>
App
</div>
)
}
}
axios发送基本网络请求
axios发送基本网络请求,直接通过axios函数发送函数。
axios发送get请求。
axios({
url: 'https://httpbin.org/get',
params: {
name: 'haha',
age: 19
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
我们可以看到get请求发送成功。
axios发送post请求。
axios({
url: 'https://httpbin.org/post',
data: {
name: 'xixi',
age: 20
},
method: 'post'
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
我们可以看到post请求发送成功。
axios发送get/post请求
axios发送网络请求除了上述基本的方式,还可以这样发送get、post请求。
axios发送get请求。
axios.get('https://httpbin.org/get', {
params: {
name: 'haha',
age: 18
}
}).then(console.log)
我们可以看到get请求发送成功。
axios发送post请求。
axios.post('https://httpbin.org/post', {
name: 'xixi',
age: 20
}).then(console.log)
我们可以看到post请求发送成功。
除了axios.get()、axios.post(),我们还可以通过axios.request()发送请求。上述我们说到的axios支持的多种请求方式本质上都是通过axios.request()发送网络请求。
async await
我们可以使用async、await发送网络请求。想要拿到错误信息,可以使用try...catch...进行包裹。
async componentDidMount() {
try {
const result = await axios.get('https://httpbin.org/get', {
params: {
name: 'haha',
age: 18
}
})
console.log(result);
} catch (err) {
console.log(err);
}
}
多个请求合并
如果有多个网络请求,我们可以通过axios.all将多个请求合并。axios.all本质上使用了Promise.all。
axios.all([request1, request2]).then(([res1, res2]) => {
console.log(res1, res2);
})
全局默认配置
如果有多个axios请求,它们的请求基地址相同,我们可以设置默认配置。默认配置可以设置baseURL、timeout、token等,那么每个axios请求都会使用这个默认配置。
axios.defaults.baseURL = 'https://httpbin.org'
axios.defaults.timeout = 5000
axios.defaults.headers.common['token'] = 'ahjhsdjfhsdka'
我们可以看到我们设置的全局默认配置。
创建实例
我们可以通过axios.create创建实例,自定义实例默认配置。
const instance = axios.create({
baseURL: 'http://baidu.com',
timeout: 5000,
headers: {
}
})
配置的优先级是这样子的。优先是使用请求的config参数配置,其次是实例的default中的配置,最后是创建实例时的配置。
axios拦截器
axios库中有一个特性是可以添加拦截器。,包括请求拦截器和响应拦截器。
请求拦截器:在发送请求时,请求被拦截。我们在什么时候可以使用请求拦截器呢?发送网络请求时,在页面中添加一个loading组件作为动画;某些网络请求要求用户必须登录,可以在请求中判断是否携带了token,没有携带token直接跳转到login页面;对某些请求参数进行序列化。
响应拦截器: 在响应结果中,结果被拦截。在响应拦截器中可以对结果进行二次处理,比如服务器中真正返回的数据其实是在response的data中;对于错误信息进行判断,根据不同的状态进行不同的处理。