1、引用axios
文档地址:https://github.com/axios/axios
有以下几种安装引用方法,选择合适的方法即可。
1)使用npm
npm install axios
2)使用bower
bower install axios
3)使用yarn
yarn add axios
4)使用pnpm
pnpm add axios
5)使用CDN
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
或
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2、配置和响应
1)响应格式
{ // `data` 是由服务器提供的响应的数据 data: {}, // `status` HTTP状态代码来自服务器响应 status: 200, // `statusText` HTTP状态消息来自服务器响应 statusText: 'OK', // `headers` 服务器响应的HTTP报头 // 所有header名称都是小写的,可以使用方括号访问。 // 例如: `response.headers['content-type']` headers: {}, // `config` 是请求提供给' axios'的配置 config: {}, // `request` 生成此响应的请求 // 它是node.js中的最后一个ClientRequest实例(在重定向中) // 也是浏览器中的一个XMLHttpRequest实例 request: {} }
2)config配置
{ // `url` 是用于请求的服务器URL url: '/user', // `method` 发出请求时使用请求方法 method: 'get', // default // `baseURL` 将被放在'url'的前面,除非'url'是绝对的。 // 为axios的实例设置' baseURL '可以方便地将相对url传递给该实例的方法。 baseURL: 'https://some-domain.com/api/', // ' transformRequest '允许在请求数据发送到服务器之前更改它 //这只适用于请求方法'PUT', 'POST', 'PATCH'和'DELETE' //数组中的最后一个函数必须返回一个字符串或Buffer的实例,ArrayBuffer, //格式化数据或流 //可以修改头文件对象。 transformRequest: [function (data, headers) { // Do whatever you want to transform the data return data; }], // 'transformResponse'允许对响应数据进行更改 //传递给then/catch transformResponse: [function (data) { // 对数据进行任何转换 return data; }], // `headers` 是要发送的自定义头 headers: {'X-Requested-With': 'XMLHttpRequest'}, // 'params'是随请求发送的URL参数 //必须是一个普通对象或URLSearchParams对象 params: { ID: 12345 }, // 'paramsSerializer'是负责序列化 'params'的可选配置。 paramsSerializer: { indexes: null // 数组索引格式(null -无括号,false -空括号,true -带索引的括号) }, // 'data'是作为请求体发送的数据 //只适用于请求方法'PUT', 'POST', 'DELETE, 'PATCH' //当没有设置' transformRequest '时,必须是以下类型之一: //字符串,普通对象,ArrayBuffer, ArrayBufferView, URLSearchParams //只有浏览器:FormData, File, Blob // - Node only: Stream, Buffer data: { firstName: 'Fred' }, //语法替代发送数据到主体 //方法后 //只发送值,不发送键 data: 'Country=Brasil&City=Belo Horizonte', // 'timeout'指定请求超时前的毫秒数。 // 如果请求时间超过"timeout",请求将被中止。 timeout: 1000, // 默认是 `0` (不超时) // 'withCredentials'表示是否跨站访问控制请求 //应该使用凭证创建 withCredentials: false, // default // 'adapter'允许自定义处理请求,这使得测试更容易。 //返回一个承诺并提供一个有效的响应(参见lib/adapters/README.md)。 adapter: function (config) { /* ... */ }, // 'auth'表示应该使用HTTP Basic身份验证,并提供凭据。 //这将设置一个'Authorization'头,覆盖任何现有的 //使用'headers'设置的'Authorization'自定义头。 //请注意,只有HTTP基本认证可以通过该参数配置。 //对于Bearer令牌等,使用'Authorization'自定义头。 auth: { username: 'janedoe', password: 's00pers3cret' }, // responseType表示服务器将响应的数据类型 //选项有:'arraybuffer', 'document', 'json', 'text', 'stream' //仅浏览器:'blob' responseType: 'json', // default // 'responseEncoding'表示解码响应时使用的编码(仅限Node.js) //注意:对'stream'或客户端请求的'responseType'忽略 responseEncoding: 'utf8', // default // 'xsrfCookieName'是用来作为xsrf令牌值的cookie的名称 xsrfCookieName: 'XSRF-TOKEN', // default // 'xsrfHeaderName'是携带xsrf令牌值的http报头名称 xsrfHeaderName: 'X-XSRF-TOKEN', // default // ' onUploadProgress '允许处理上传的进度事件 // 仅浏览器 onUploadProgress: function (progressEvent) { // 对本机进度事件执行任何想要的操作 }, // 'onDownloadProgress'允许处理下载的进度事件 // 仅浏览器 onDownloadProgress: function (progressEvent) { // 对本机进度事件执行任何想要的操作 }, // 'maxContentLength'定义了node.js中允许的http响应内容的最大字节数 maxContentLength: 2000, // 'maxBodyLength'(仅限节点选项)定义了http请求内容的最大字节数 maxBodyLength: 2000, // 'validateStatus'定义了是否解析或拒绝给定的承诺 // HTTP响应状态码。如果'validateStatus'返回'true'(或设置为'null') //或'undefined'), promise将被解决;否则,承诺将是rejected。 validateStatus: function (status) { return status >= 200 && status < 300; // default }, // 'maxRedirects'定义了node.js中重定向的最大数量。 //如果设置为0,没有重定向将遵循。 maxRedirects: 21, // default // 'beforeeredirect'定义了一个将在重定向之前调用的函数。 //在重定向时调整请求选项 //检查最新的响应头 //或者通过抛出错误来取消请求 //如果maxRedirects设置为0,'beforeeredirect'是不使用的。 beforeRedirect: (options, { headers }) => { if (options.hostname === "example.com") { options.auth = "user:password"; } }, // `socketPath`定义了一个要在node.js中使用的UNIX Socket。 //'/var/run/docker.sock' 。向docker守护进程发送请求。 //只能指定' socketPath '或'proxy'。 //如果两者都指定,则使用'socketPath'。 socketPath: null, // default // 'httpAgent'和'httpAgent'定义了执行http时使用的自定义代理 //和HTTPS请求,分别在node.js中。这允许像这样添加选项 //默认情况下未启用的keepAlive。 httpAgent: new http.Agent({ keepAlive: true }), httpsAgent: new https.Agent({ keepAlive: true }), // 'proxy'定义代理服务器的主机名、端口和协议。 //也可以定义你的代理使用传统的' http_proxy '和 // 'https_proxy'环境变量。如果正在使用环境变量 //对于代理配置,也可以定义一个“no_proxy”环境 //变量作为一个逗号分隔的不应该被代理的域列表。 //使用'false'禁用代理,忽略环境变量。 //“auth”表示HTTP基本身份验证应该用于连接到代理,并且 //提供凭证。 //这将设置一个' Proxy-Authorization '头,覆盖任何现有的 //已经使用'headers'设置了'代理授权'自定义头。 //如果代理服务器使用HTTPS,那么必须设置协议为'HTTPS'。 proxy: { protocol: 'https', host: '127.0.0.1', port: 9000, auth: { username: 'mikeymike', password: 'rapunz3l' } }, // 'cancelToken'指定一个取消令牌,可以用来取消请求 //(详见取消部分) cancelToken: new CancelToken(function (cancel) { }), // 使用AbortController取消Axios请求的另一种方法 signal: new AbortController().signal, // 'decompress'表示响应体是否应该被解压 //自动。如果设置为'true'也会删除'content-encoding'头 //从所有解压缩响应的响应对象 //- Node only (XHR不能关闭解压) decompress: true // default // insecureHTTPParser 布尔类型。 //指定在哪里使用不安全的HTTP解析器,该解析器接受无效的HTTP头。 //这可能允许与不符合的HTTP实现互操作性。 //应该避免使用不安全的解析器。 //查看options https://nodejs.org/dist/latest-v12.x/docs/api/http.html#http_http_request_url_options_callback //参见https://nodejs.org/en/blog/vulnerability/february-2020-security-releases/#strict-http-header-parsing... insecureHTTPParser: undefined // default // 向后兼容性的transitional选项,可能在较新的版本中被删除 transitional: { //静默JSON解析模式 // 'true' -忽略JSON解析错误并设置响应。如果解析失败,数据为空(旧行为) // 'false' -抛出SyntaxError如果JSON解析失败(注意:responseType必须设置为'JSON') silentJSONParsing: true, // 当前axios版本的默认值 // 尝试将响应字符串解析为JSON,即使'responseType'不是'JSON' forcedJSONParsing: true, // 请求超时时抛出ETIMEDOUT错误而不是一般的ECONNABORTED错误 clarifyTimeoutError: false, }, env: { // 用于自动将有效负载序列化为FormData对象的FormData类 FormData: window?.FormData || global?.FormData }, formSerializer: { visitor: (value, key, path, helpers)=> {}; // 自定义访问者函数操作,用于序列化表单值 dots: boolean; // 用点代替括号格式 metaTokens: boolean; // 在参数key中保留{}这样的特殊结尾 indexes: boolean; // 数组索引格式为 null -无括号,false -空括号,true -带索引的括号 } }
3、执行get和post请求
1)执行get请求
const axios = require('axios').default; // Make a request for a user with a given ID axios.get('/user?ID=12345') .then(function (response) { // handle success console.log(response); }) .catch(function (error) { // handle error console.log(error); }) .then(function () { // always executed }); // Optionally the request above could also be done as axios.get('/user', { params: { ID: 12345 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }) .then(function () { // always executed }); // Want to use async/await? Add the `async` keyword to your outer function/method. async function getUser() { try { const response = await axios.get('/user?ID=12345'); console.log(response); } catch (error) { console.error(error); } }
或者
axios({ method: 'get', url: 'https://bit.ly/2mTM3nY', responseType: 'stream' }) .then(function (response) { response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) });
2)执行post请求
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
或者
axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } });
为了方便起见,所有常见请求方法都提供了别名。如下,
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]])
4、设置请求的timeout超时时间
1)使用自定义创建并设置timeout时间
const instance = axios.create({ baseURL: 'https://some-domain.com/api/', timeout: 1000, headers: {'X-Custom-Header': 'foobar'} }); console.log("pre call") try { await instance.post('/debug/throw') console.log("post call passed") } catch (err) { console.log("post call failed") }
2)设置全局timeout超时时间
axios.defaults.timeout = 30000;