Skip to main content

如何在React中运行Axios

作者 Paul Halliday

导语

许多项目在开发时都可能需要用到REST API。Axios是Angular.js v1.x下,一个基于 $http 服务的轻量级HTTP客户端。Axios与JavaScript自带的Fetch API类似。

同时,Axios因基于promise对象,从而可以利用JavaScript的 asyncawait 产出可读性更强的异步代码。Axios支持用户拦截和取消请求,且内置了对伪造的跨站点请求的防御。

本文将举例说明如何在React中应用Axios访问当下流行的JSON Placeholder API。

前期准备

阅读本文前,你需要做如下前期准备:

  • 安装Node.js 10.06.0版本
  • 使用Create React App创建一个新的React项目
  • 对JavaScript有基本的了解

本教程已在Node.js 16.13.1版本,npm 8.1.4版本,react 17.0.2版本及 axios 0.24.0版本下验证过。

第一步:在项目中添加Axios

这个章节将会介绍如何在新建的React项目中添加Axios。

$ npx create-react-app react-axios-example

首先,在添加Axios前,打开终端并将路径改为项目的路径:

$ cd react-axios-example

然后运行以下命令来安装Axios:

$ npm install axios@0.24.0

下一步则需将Axios导入需要使用它的文件夹中。

第二步:创建一个 GET 请求

以下例子将会新建一个组件,并将Axios导入其中来发送一个 GET 请求。

在项目中创建一个新组件,将它命名为 PersonList

首先,在 src 路径下新创建一个 components 子路径:

$ mkdir src/components

在这个路径中,创建 PersonList.js 并将以下代码添加到组件中:

import React from 'react';
import axios from 'axios';

export default class PersonList extends React.Component {
state = {
persons: []
}

componentDidMount() {
axios.get(`https://jsonplaceholder.typicode.com/users`)
.then(res => {
const persons = res.data;
this.setState({ persons });
})
}

render() {
return (
<ul>
{
this.state.persons
.map(person =>
<li key={person.id}>{person.name}</li>
)
}
</ul>
)
}
}

通过这段代码,React和Axios都已被导入,可以在组件中使用了。而且还挂钩到了componentDidMount生命周期钩子,并执行了一个 GET 请求。

这段代码还从一个API端点中,使用 axios.get(url) 导入了一个URL地址来得到一个promise,而promise对象会返回一个response对象。在这个response对象中,有一些数据会被 person 赋值。

此外,你还可以获取有关这个请求的其它信息,例如 res.status 下的状态代码,或是 res.status 中的更多信息。

然后,在 app.js 中添加如下组件:

import PersonList from './components/PersonList.js';

function App() {
return (
<div ClassName="App">
<PersonList/>
</div>
)
}

接着运行程序:

$ npm start

现在,在浏览器中查看这个程序,浏览器上会显示一个包含十个名字的名单。

第三步:创建一个 POST 请求

这一步将介绍如何使用Axios中的另一个HTTP请求方法 POST

在React项目中新建一个新组件,将它命名为 PersonAdd。创建 PersonAdd.js,在其中添加以下代码来创建一个表格。这个表格支持用户输入内容,且会将内容 POST 在API中。

import React from 'react';
import axios from 'axios';

export default class PersonAdd extends React.Component {
state = {
name: ''
}

handleChange = event => {
this.setState({ name: event.target.value });
}

handleSubmit = event => {
event.preventDefault();

const user = {
name: this.state.name
};

axios.post(`https://jsonplaceholder.typicode.com/users`, { user })
.then(res => {
console.log(res);
console.log(res.data);
})
}

render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<label>
Person Name:
<input type="text" name="name" onChange={this.handleChange} />
</label>
<button type="submit">Add</button>
</form>
</div>
)
}
}

上述代码中,handleSubmit 函数阻止了表格的默认操作,并将 state 更新为 user 输入。

POST 会给出一样的response对象,其中包含调用 then 时可以用到的信息。

完成 POST 请求需要先抓取 user 输入,然后将其添加至 POST 请求中。POST 请求会给出一个response,可以对这个response使用 console.log,这样 user 输入就会出现在表格上。

然后在 app.js 中添加这个组件:

import PersonList from './components/PersonList';
import PersonAdd from './components/PersonAdd';

function App() {
return (
<div ClassName="App">
<PersonAdd/>
<PersonList/>
</div>
)
}

接着,运行程序:

$ npm start

现在,在浏览器中查看这个程序,可以看到等待提交新用户的表格。每提交一个新用户,记得检查控制台。

第四步:创建一个DELETE请求

以下例子将会介绍如何通过使用 axios.delete 和将URL作为形参传入,来删除API中的内容。

在React项目中创建一个新组件,将它命名为 PersonRemove。创建 PersonRemove.js,在其中添加以下代码来删除一个用户。

import React from 'react';
import axios from 'axios';

export default class PersonRemove extends React.Component {
state = {
id: ''
}

handleChange = event => {
this.setState({ id: event.target.value });
}

handleSubmit = event => {
event.preventDefault();

axios.delete(`https://jsonplaceholder.typicode.com/users/${this.state.id}`)
.then(res => {
console.log(res);
console.log(res.data);
})
}

render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<label>
Person ID:
<input type="number" name="id" onChange={this.handleChange} />
</label>
<button type="submit">Delete</button>
</form>
</div>
)
}
}

与之前的例子类似,res 对象会提供关于这个请求的信息。可以在表格提交后对这些信息使用 console.log

然后在 app.js 中添加这个组件:

import PersonList from './components/PersonList';
import PersonAdd from './components/PersonAdd';
import PersonRemove from './components/PersonRemove';

function App() {
return (
<div ClassName="App">
<PersonAdd/>
<PersonList/>
<PersonRemove/>
</div>
)
}

接着,运行程序:

$ npm start

现在,在浏览器中查看这个程序,可以看到用于删除用户的表格。

第五步:在Axios中创建Base实例

以下例子将会介绍如何创建一个base实例。这个实例可以用于定义URL,以及任何配置元素。

创建一个单独的文件,将它命名为 api.js

$ nano src/api.js

导出以下 axios 实例:

import axios from 'axios';

export default axios.create({
baseURL: `http://jsonplaceholder.typicode.com/`
});

默认实例在创建完成后,可以在 PersonRemove 组件内使用。可以如下面代码所示,导入这个新实例:

import React from 'react';

import API from '../api';

export default class PersonRemove extends React.Component {
// ...

handleSubmit = event => {
event.preventDefault();

API.delete(`users/${this.state.id}`)
.then(res => {
console.log(res);
console.log(res.data);
})
}

// ...
}

现在,http://jsonplaceholder.typicode.com/ 是新的基URL了。每次访问另一个API端点时无需再输入完整的URL。

第六步:使用 asyncawait

以下例子将会介绍如何通过使用 asyncawait 处理promise。await 关键词会解决 promise 并返回 valuevalue 可以赋值给变量。

import React from 'react';

import API from '../api';

export default class PersonRemove extends React.Component {
// ...

handleSubmit = event => {
event.preventDefault();

const response = await API.delete(`users/${this.state.id}`);

console.log(response);
console.log(response.data);
}

// ...
}

以上代码替换了 .then() 并解决了 promisepromise 的值赋给了 response 变量。

结语

本教程主要通过几个例子介绍了如何在React中应用Axios,来创建HTTP请求,并解决请求的response。