axios 中文文档 翻译

news/2024/5/17 18:22:20

0.18.0的版本更新有一段时间了,使用起来跟原先基本没有什么变化。但是增加了一些功能,例如错误处理的辨别,于07-06-2018重新翻译和校验了该翻译,更正了一些错别字和表达不准的地方,但是难免仍有错误,欢迎指出。

由于工作需要,个人也包装了一个简易的跟axios风格一样在小程序中使用的请求函数。方便一些使用类似vue写法框架来开发小程序的人更方便的无缝桥接。
有需要的读者可以观看一下。 传送门

关于Promise的一练习和训练,此处有一个比较好的集合。传送门

正文

基于Promise的http库,适用于浏览器和node.js。

原文

点击查看原文

特色

  • 浏览器端发起XMLHttpRequests请求
  • node端发起http请求
  • 支持Promise API
  • 拦截请求和返回
  • 转化请求和返回(数据)
  • 取消请求
  • 自动转化json数据
  • 客户端支持抵御XSRF(跨站请求伪造)

浏览器支持

Chrome

Firefox

Safari

Opera

Edge

IE

Latest ✔Latest ✔Latest ✔Latest ✔Latest ✔8+ ✔

安装

使用npm:

$ npm i axios

使用 bower

$ bower instal axios

使用cdn

<!--国内bootCDN-->
<script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>

示例

发起一个GET请求

const axios = require('axios')//发起一个user请求,参数为给定的ID
axios.get('/user?ID=12345')
.then(function(respone){console.log(response);
})
.catch(function(error){console.log(error);
});//可配置的方式实现上面的代码如下
axios.get('/user',{params:{ID:12345}
}).then(function(response){console.log(response);}).catch(function(error){console.log(error)});

注意:async/await是ECMAScript2017的语法,ie和一些老旧的浏览器不支持,请小心使用。
(译者话:使用ts的话可以很容易的编译和使用,也不需要任何垫片,目标编译成es5即可)

发起一个POST请求

axios.post('/user',{firstName:'friend',lastName:'Flintstone'
})
.then(function(response){console.log(response);
})
.catch(function(error){console.log(error);
});

发起一个多重并发请求

function getUserAccount(){return axios.get('/user/12345');
}function getUserPermissions(){return axios.get('/user/12345/permissions');
}axios.all([getUerAccount(),getUserPermissions()]).then(axios.spread(function(acc,pers){//两个请求现在都完成}));

译者话:因为axios.all使用的是类似Primise.all的功能,所以如果其中有一个请求出现了错误那么就会停止请求,所以建议对于单个请求最好附加上处理的catch。

axios API


根据自己需求可以对axios传递一些的设置来生成请求(Request)。

axios(config)

//发起 POST请求axios({method:'post',//方法url:'/user/12345',//地址data:{//参数firstName:'Fred',lastName:'Flintstone'}
});
//通过请求获取远程图片
axios({method:'get',url:'http://bit.ly/2mTM3Ny',responseType:'stream'
}).then(function(response){response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))})

axios(url[,config])

//发起一个GET请求
axios('/user/12345/);

请求方法的别名。

为了方便,axios提供了所有请求方法的别名支持

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]])

注意

当时用别名方法时url,method,以及data属性不必在config中明确指定(如上面示例的post方法请求)。

并发 Concurrency

有用的方法

axios.all(iterable)
axios.spread(callback)

创建一个实例(instance)

你可以使用自定义设置创建一个新的实例

axios.create([config])

var instance = axios.create({baseURL:'http://some-domain.com/api/',timeout:1000,headers:{'X-Custom-Header':'foobar'}
});
实例方法

下面列出了一些实例可用方法,具体的设置将在实例中应用。

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]])

Requeset Config请求设置

以下列出了一些请求时的设置选项。只有url是必须的,如果没有指明method的话,默认的请求方法是GET.

{//`url`是服务器链接,用来请求url:'/user',//`method`是发起请求时的方法method:`get`,//`baseURL`如果`url`不是绝对地址,那么将会加在其前面。//可以很方便的对相对地址的axios实例设置`baseUrl`。baseURL:'http://some-domain.com/api/',//`transformRequest`允许请求的数据在发送至服务器之前进行转化。//这个只适用于`PUT`,`POST`,`PATCH`方法。//数组中的最后一个函数必须返回一个字符串或者一个`ArrayBuffer`,或者`Stream`,`Buffer`实例,`ArrayBuffer`,`FormData`//此外你也可能需要设置下headers对象transformRequest:[function(data,headers){//依自己的需求对请求数据进行处理return data;}],//`transformResponse`允许对返回的数据传入then/catch之前进行处理transformResponse:[function(data){//依需要对数据进行处理return data;}],//`headers`是自定义的要被发送的信息头headers:{'X-Requested-with':'XMLHttpRequest'},//`params`是请求连接中的请求参数,必须是一个纯对象,或者URLSearchParams对象params:{ID:12345},//`paramsSerializer`是一个可选的函数,用来控制和序列化参数//例如:(https://ww.npmjs.com/package/qs,http://api.jquery.com/jquery.param/)paramsSerializer: function(params){return Qs.stringify(params,{arrayFormat:'brackets'})},//`data`是请求时作为请求体的数据//只适用于应用的'PUT','POST','PATCH',请求方法//当没有设置`transformRequest`时,必须是以下其中之一的类型(不可重复?)://-string(字符串),plain object(纯对象),ArrayBuffer,ArrayBufferView,URLSearchParams//-限浏览器:FormData(表格数据),File(文件数据),Blob//-限Node:Streamdata:{firstName:'fred'},//`timeout`定义请求的时间,单位是毫秒。//如果请求的时间超过这个设定时间,请求将会停止。timeout:1000,//`withCredentials`表明跨跨域请求书否需要证明。withCredentials:false //默认值//`adapter`适配器,允许自定义处理请求,这会使测试更简单。//返回一个promise,并且提供一个有效的相应。(查看[response docs](#response-api))adapter:function(config){/*...*/},//`auth`表明HTTP基础的认证应该被使用,并且提供证书。//这个会设置一个`authorization` 头(header),并且覆盖你在header设置的Authorization头信息。auth:{username:'janedoe',password:'s00pers3cret'},//`responsetype`表明服务器返回的数据类型,这些类型的设置应该是//'arraybuffer','blob','document','json','text',stream'responsetype:'json',//`responseEncoding`表明解析相应的编码方式。//**注意**会忽视responseType为stream或者客户端的请求。responseEncoding:'utf8'//默认值//`xsrfCookieName`时cookie做xsrf会话时的名字。xsrfCookieName:'XSRF-TOKEN',//默认值//`xsrfHeaderName` 是http头(header)的名字,并且该头携带xsrf的值xrsfHeadername:'X-XSRF-TOKEN',//默认值//`onUploadProgress`允许处理上传过程的进程事件onUploadProgress: function(progressEvent){//本地过程事件发生时想做的事},//`onDownloadProgress`允许处理下载过程的进程事件onDownloadProgress: function(progressEvent){//下载过程中想做的事},//`maxContentLength` 定义http返回内容的最大字节容量maxContentLength: 2000,//`validateStatus` 定义promise的resolve和reject。//http返回状态码,如果`validateStatus`返回true(或者设置成null/undefined),promise将会resolve;其他的promise将reject。validateStatus: function(status){return status >= 200 && stauts < 300;//默认},//`maxRedirect`定义重导向到node.js中的最大数量。//如果值为0,那么没有redirect。maxREdirects:5,//默认值//`socketPath`定义一个在node.js中使用的 `UNIX Socket`。//例如 `/var/run/docker.sock`发送请求到docker daemon。//`socketPath`和`proxy`只可定义其一。//如果都定义则只会使用`socketPath`。socketPath:null,//默认值//`httpAgent` 和 `httpsAgent`当产生一个http或者https请求时分别定义一个自定义的代理,在nodejs中。//这个允许设置一些选选个,像是`keepAlive`--这个在默认中是没有开启的。httpAgent: new http.Agent({keepAlive:treu}),httpsAgent: new https.Agent({keepAlive:true}),//`proxy`定义服务器的主机名字和端口号。//`auth`表明HTTP基本认证应该跟`proxy`相连接,并且提供证书。//这个将设置一个'Proxy-Authorization'头(header),覆盖原先自定义的。proxy:{host:127.0.0.1,port:9000,auth:{username:'cdd',password:'123456'}},//`cancelTaken` 定义一个取消,能够用来取消请求//(查看 下面的Cancellation 的详细部分)cancelToken: new CancelToken(function(cancel){})
}

返回响应概要 Response Schema

一个请求的返回包含以下信息

{//`data`是服务器的提供的回复(相对于请求)data{},//`status`是服务器返回的http状态码status:200,//`statusText`是服务器返回的http状态信息statusText: 'ok',//`headers`是服务器返回中携带的headersheaders:{},//`config`是对axios进行的设置,目的是为了请求(request)config:{}//`request`是获取当前相应的请求//它是node.js中最后一次的 ClientRequest的实例(在redirect中)//或者是在浏览器中的XMLHttpREquest实例
}

使用then时,你会接受到下面的信息:

axios.get('/user/12345').then(function(response){console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);});

使用catch时,或者传入一个reject callback作为then的第二个参数,那么返回的错误信息将能够被处理。


默认设置(Config Default)

你可以设置一个默认的设置,这设置将在之后的每次请求中生效。

全局默认设置 Global axios defaults
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type']='application/x-www-form-urlencoded';
实例中自定义默认值 Custom instance default
//当创建一个实例时进行默认设置
var instance = axios.create({baseURL:'https://api.example.com'
});//或者在实例创建之后改变默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
设置优先级 Config order of precedence

设置(config)将按照优先顺序合并起来。首先的是在lib/defaults.js中定义的默认设置,其次是defaults实例属性的设置,最后是请求中config参数的设置。越往后面的等级越高,会覆盖前面的设置。
看下面这个例子:

//使用默认库的设置创建一个实例,
//这个实例中,使用的是默认库的timeout设置,默认值是0。
var instance = axios.create();//覆盖默认库中timeout的默认值
//此时,所有的请求的timeout时间是2.5秒
instance.defaults.timeout = 2500;//覆盖该次请求中timeout的值,这个值设置的时间更长一些
instance.get('/longRequest',{timeout:5000
});

拦截器 interceptors

你可以在请求或者返回then或者catch处理之前对他们进行拦截。

//添加一个请求拦截器
axios.interceptors.request.use(function(config){//在请求发送之前做一些事return config;
},function(error){//当出现请求错误是做一些事return Promise.reject(error);
});//添加一个返回拦截器
axios.interceptors.response.use(function(response){//对返回的数据进行一些处理return response;
},function(error){//对返回的错误进行一些处理return Promise.reject(error);
});

如果你需要在稍后移除拦截器,你可以

var myInterceptor = axios.interceptors.request.use(function(){/*...*/});
axios.interceptors.request.eject(myInterceptor);

你可以在一个axios实例中使用拦截器

var instance = axios.create();
instance.interceptors.request.use(function(){/*...*/});

错误处理 Handling Errors

axios.get('user/12345').catch(function(error){if(error.response){//存在请求,但是服务器的返回一个状态码//他们是在2xx之外console.log(error.response.data);console.log(error.response.status);console.log(error.response.headers);}else if(error.request){//如果是请求时的错误,且没有收到相应//`error.request`是一个浏览器的XMLHttpRequest实例,或者node.js的 ClientRequest实例。console.log(error.request)} else{//一些错误是在设置请求时触发的console.log('Error',error.message);}console.log(error.config);});

你可以使用validateStatus设置选项自定义HTTP状态码的错误范围。

axios.get('user/12345',{validateStatus:function(status){return status < 500;//当返回码小于等于500时视为错误}
});

取消 Cancellation

你可以使用cancel token取消一个请求

axios的cancel token API是基于已经撤销的**cnacelable promises proposal**提议。

你可以使用CancelToken.source工厂函数创建一个cancel token,如下:

var CancelToken = axios.CancelToken;
var source = CancelToken.source();axios.get('/user/12345', {cancelToken:source.toke
}).catch(function(thrown){if(axiso.isCancel(thrown)){console.log('Rquest canceled', thrown.message);}else{//handle error}
});//取消请求(信息参数设可设置的)
source.cancel("操作被用户取消");

你可以给CancelToken构造函数传递一个executor function来创建一个cancel token:

var CancelToken = axios.CancelToken;
var source = CancelToken.source()axios.get('/user/12345',{cancelToke:source.token
}).catch(function(thrown){if(axios.isCancel(throw)){console.log('请求已取消',throw.message)}else{//处理错误}
})axios.post('/user/2345',{name:'new name'
},{cancelToken:source.toke
})source.cancel('错做已被用户取消!')

你也可以给CancelToke的构造函数传递一个处理函数来生成一个cancel token。

const CancelToken = axios.CancelToken
let cancel;acios.get('/user/12345',{cancelToken:new CancelToken(function excutor(c){//一个处理函数接受一个cancel函数作为参数cancel = c})
})// 取消请求
cancel()
注意:你可以使用同一个cancel token取消多个请求。

使用 application/x-www-form-urlencoded 格式

本人做的简单包装

默认情况下,axios串联js对象为JSON格式。为了发送application/x-wwww-form-urlencoded格式数据,
你可以使用一下的设置。

浏览器 Browser

在浏览器中你可以如下使用URLSearchParams API:

var params = new URLSearchParams();
params.append('param1','value1');
params.append('param2','value2');
axios.post('/foo',params);

注意:URLSearchParams不支持所有的浏览器,但是这里有个垫片
(poly fill)可用(确保垫片在浏览器全局环境中)

其他方法:你可以使用qs库来对数据编码。

var qs = require('qs');
axios.post('/foo', qs.stringify({'bar':123}));

或者其他方法(es6)

import qs from 'qs';
const data = {'bar':123};
const options = {method:'POST',headers:{'content-type':'application/x-www-from-urlencoded'},data:qs.stringify(data),url
}
axios(options)

兼容Semver

当axios放出1.0版本时,一些不兼容的更改将会放在新的版本中。例如0.5.10.5.4有相同的api,但是0.6.0会有不兼容的变化。

译者:小知识
在npm的版本习惯中,版本使用的习惯是a.b.c,其中c的变化是一些bug的修复,b是一些功能的添加,a是大的版本的变化,会出现不兼容的情况。

Node.js

在nodejs中,你可以如下使用querystring:

var querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({foo:'bar'}));

你同样可以使用qs库。


promises

axios 基于原生的ES6 Promise 实现。如果环境不支持请使用垫片.

TypeScript

axios 包含TypeScript定义

import axios from 'axios'
axios.get('/user?ID=12345')

 

仅供参考!!! 


http://www.mrgr.cn/p/08283331

相关文章

【Unity学习笔记】第十四 Prefab 概念解惑

目录 1 prefab、prefab变体、prefab覆盖和prefab 嵌套2 connect 与unpack3 prefab到底是什么&#xff0c;它和gameobject又有什么区别&#xff1f;4 为什么要用prefab&#xff1f;5 代码动态加载prefab6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null7 Prefab…

【数据结构】:链表的带环问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…

Xcode隐私协议适配

1. Privacy manifest files 1.1 简介 自己App或三方SDK&#xff08;通过XCFrameworks|Swift packages|Xcode projects集成的&#xff09;需要包含一个隐私清单文件&#xff08;privacy manifest&#xff09;叫作 PrivacyInfo.xcprivacy。它是一个属性列表&#xff0c;记录了A…

盲人手机导航:科技之光引领无障碍出行新纪元

在这个日新月异的数字时代&#xff0c;科技不仅改变了我们获取信息的方式&#xff0c;更在无声中拓宽了视障人士的生活半径。盲人手机导航这一创新技术&#xff0c;正逐步成为他们探索世界、实现独立出行的重要伙伴。 对于大多数人而言&#xff0c;日常出行或许只是一次…

Python绘制的好看统计图

代码 sx [Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, P…

特征重要性评估的随机森林算法与Python实现(三)

特征重要性评估(Variable importance measure, or Feature importance evaluation,VIM)用来计算样本特征的重要性,定量地描述特征对分类或者回归的贡献程度。随机森林(Random Forest)作为一种强大的机器学习算法,在特征重要性评估方面具有显著优势。特征重要新评估是随机森…

社会网络分析及其Python实现

社会网络分析(Social Network Analysis, SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会…

Jenkins邮件发送失败问题解决

如下提示为 Extended E-mail Notification开启Debug模式下显示的错误信息&#xff0c; (Debug模式设置方法&#xff1a;Dashboard-> manage Jenkins->configure System)DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEB…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式&#xff0c;但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式&#xff0c;旨在通过使用一个工厂类来创建对象&#xff0c;而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护&#xff0c;因为新的对…

IDA动态调试解RC4

IDA动态调试解RC4 本篇博客所有内容,均学习于无名侠大佬在bilibili的视频:https://www.bilibili.com/video/BV1WQ4y1X7TY LazyIDA熊猫版:https://github.com/P4nda0s/LazyIDA 实验文件下载:https://github.com/P4nda0s/SycRevLearn有一些算法的加密与解密是相同的算法过程,…

2024 java easyexcel poi word模板填充数据,多个word合成一个word

先看效果 一、准备工作 1.word模版 2.文件路径 二、pom依赖 <!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency><depe…

[CISCN 2022 华东北] duck

[CISCN 2022 华东北] duck UAF|leak_libc|leak_heap_base|指针加密|unsortedbin|one_gadget [*] /home/bamuwe/duck/pwnArch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX enabledPIE: PIE enabled$ checksec ./pwn/home/ubuntu/glibc/gl…

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…

LeetCode - 买卖股票的最佳时机

121. 买卖股票的最佳时机 给出一个数组&#xff0c;在这个数组中&#xff0c;买入一支股票&#xff0c;并在未来的某一天卖出(不能当天买&#xff0c;当天卖)&#xff0c;如何获取最大利润。 如果你做过买卖股票2&#xff0c;那么在做这道题的时候&#xff0c;大概率是会想到动…

【已解决】Python Selenium chromedriver Pycharm闪退的问题

概要 根据不同的业务场景需求&#xff0c;有时我们难免会使用程序来打开浏览器进行访问。本文在pycharm中使用selenium打开chromedriver出现闪退问题&#xff0c;根据不断尝试&#xff0c;最终找到的问题根本是版本问题。 代码如下 # (1) 导入selenium from selenium import …

决策树分析及其在项目管理中的应用

决策树分析是一种分类学习方法&#xff0c;其主要用于解决分类和回归问题。在决策树中&#xff0c;每个内部节点表示一个属性上的测试&#xff0c;每个分支代表一个属性输出&#xff0c;而每个叶节点则代表类或类分布。通过从根节点到内部节点的路径&#xff0c;可以构建一系列…

Android 音视频基础知识

本系列文章会介绍两个 Android NDK Demo&#xff0c;拉流端会实现一个基于 FFmpeg 的视频播放器 Demo&#xff0c;推流端会实现一个视频直播 Demo&#xff0c;当然在做 Demo 之前会介绍音视频的基础知识。以下是本系列文章的目录&#xff1a; Android 音视频基础知识 Android 音…

如何同时或者按顺序间隔启动多个程序

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z1、打开工具,切换到定时器模块,快捷键:Ctrl+3 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件…

ef core加密存储数据,如身份证号

一、新建项目,安装nuget<PackageReference Include="V6.EntityFrameworkCore.DataEncryption" Version="5.0.0" />二、本示例采用:AES+256bits(Can use a 128bits, 192bits or 256bits key)CipherMode mode = CipherMode.CBC, PaddingMode padding…

如何快速的追加文章的内容(在不知道内容的情况下)

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 1、打开工具,切换到文章模块下,快捷键:Ctrl+12、新建一个文章做演示,001 3、添加一个内容,就随便写一个 4、保存、关闭 5、在新建的文章上右键,选择追加内容 6、弹出一个窗口,有三种选择,我这里就…