Axios 是一個基於 promise 的 HTTP 庫,能夠用在瀏覽器和 node.js 中。javascript
Axios 是一個基於 promise 的 HTTP 庫,能夠用在瀏覽器和 node.js 中。 css
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
使用 npm:
使用 bower:html
npm install axios
複製代碼
bower install axios
複製代碼
使用 cdn:vue
執行 GET
請求java
// 爲給定 ID 的 user 建立請求
axios.get('/user?ID=12345')
.then(function (response) {
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);
});
複製代碼
執行 POST
請求node
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
複製代碼
執行多個併發請求jquery
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 兩個請求如今都執行完成
}));
複製代碼
// 發送 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'))
});
複製代碼
// 發送 GET 請求(默認的方法)
axios('/user/12345');
複製代碼
在使用別名方法時, url
、method
、data
這些屬性都沒必要在配置中指定。 es6
const instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
複製代碼
這些是建立請求時能夠用的配置選項。只有 url
是必需的。若是沒有指定 method
,請求將默認使用 get
方法。
{
// `url` 是用於請求的服務器 URL
url: '/user',
// `method` 是建立請求時使用的方法
method: 'get', // default
// `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL。
// 它能夠經過設置一個 `baseURL` 便於爲 axios 實例的方法傳遞相對 URL
baseURL: 'https://some-domain.com/api/',
// `transformRequest` 容許在向服務器發送前,修改請求數據
// 只能用在 'PUT', 'POST' 和 'PATCH' 這幾個請求方法
// 後面數組中的函數必須返回一個字符串,或 ArrayBuffer,或 Stream
transformRequest: [function (data, headers) {
// 對 data 進行任意轉換處理
return data;
}],
// `transformResponse` 在傳遞給 then/catch 前,容許修改響應數據
transformResponse: [function (data) {
// 對 data 進行任意轉換處理
return data;
}],
// `headers` 是即將被髮送的自定義請求頭
headers: {'X-Requested-With': 'XMLHttpRequest'},
// `params` 是即將與請求一塊兒發送的 URL 參數
// 必須是一個無格式對象(plain object)或 URLSearchParams 對象
params: {
ID: 12345
},
// `paramsSerializer` 是一個負責 `params` 序列化的函數
// (e.g. https://www.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 專屬: Stream
data: {
firstName: 'Fred'
},
// `timeout` 指定請求超時的毫秒數(0 表示無超時時間)
// 若是請求話費了超過 `timeout` 的時間,請求將被中斷
timeout: 1000,
// `withCredentials` 表示跨域請求時是否須要使用憑證
withCredentials: false, // default
// `adapter` 容許自定義處理請求,以使測試更輕鬆
// 返回一個 promise 並應用一個有效的響應 (查閱 [response docs](#response-api)).
adapter: function (config) {
/* ... */
},
// `auth` 表示應該使用 HTTP 基礎驗證,並提供憑據
// 這將設置一個 `Authorization` 頭,覆寫掉現有的任意使用 `headers` 設置的自定義 `Authorization`頭
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
// `responseType` 表示服務器響應的數據類型,能夠是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType: 'json', // default
// `responseEncoding` indicates encoding to use for decoding responses
// Note: Ignored for `responseType` of 'stream' or client-side requests
responseEncoding: 'utf8', // default
// `xsrfCookieName` 是用做 xsrf token 的值的cookie的名稱
xsrfCookieName: 'XSRF-TOKEN', // default
// `xsrfHeaderName` is the name of the http header that carries the xsrf token value
xsrfHeaderName: 'X-XSRF-TOKEN', // default
// `onUploadProgress` 容許爲上傳處理進度事件
onUploadProgress: function (progressEvent) {
// Do whatever you want with the native progress event
},
// `onDownloadProgress` 容許爲下載處理進度事件
onDownloadProgress: function (progressEvent) {
// 對原生進度事件的處理
},
// `maxContentLength` 定義容許的響應內容的最大尺寸
maxContentLength: 2000,
// `validateStatus` 定義對於給定的HTTP 響應狀態碼是 resolve 或 reject promise 。若是 `validateStatus` 返回 `true` (或者設置爲 `null` 或 `undefined`),promise 將被 resolve; 不然,promise 將被 rejecte
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
// `maxRedirects` 定義在 node.js 中 follow 的最大重定向數目
// 若是設置爲0,將不會 follow 任何重定向
maxRedirects: 5, // default
// `socketPath` defines a UNIX Socket to be used in node.js.
// e.g. '/var/run/docker.sock' to send requests to the docker daemon.
// Only either `socketPath` or `proxy` can be specified.
// If both are specified, `socketPath` is used.
socketPath: null, // default
// `httpAgent` 和 `httpsAgent` 分別在 node.js 中用於定義在執行 http 和 https 時使用的自定義代理。容許像這樣配置選項:
// `keepAlive` 默認沒有啓用
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// 'proxy' 定義代理服務器的主機名稱和端口
// `auth` 表示 HTTP 基礎驗證應當用於鏈接代理,並提供憑據
// 這將會設置一個 `Proxy-Authorization` 頭,覆寫掉已有的經過使用 `header` 設置的自定義 `Proxy-Authorization` 頭。
proxy: {
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
// `cancelToken` 指定用於取消請求的 cancel token
// (查看後面的 Cancellation 這節瞭解更多)
cancelToken: new CancelToken(function (cancel) {
})
}
複製代碼
某個請求的響應包含如下信息
{
// `data` 由服務器提供的響應
data: {},
// `status` 來自服務器響應的 HTTP 狀態碼
status: 200,
// `statusText` 來自服務器響應的 HTTP 狀態信息
statusText: 'OK',
// `headers` 服務器響應的頭
headers: {},
// `config` 是爲請求提供的配置信息
config: {},
// 'request'
// `request` is the request that generated this response
// It is the last ClientRequest instance in node.js (in redirects)
// and an XMLHttpRequest instance the browser
request: {}
}
複製代碼
使用 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
時,或傳遞 rejection callback 做爲 then
的第二個參數時,響應能夠經過 error
對象可被使用,正如在錯誤處理這一節所講。
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';
複製代碼
// Set config defaults when creating the instance
const instance = axios.create({
baseURL: 'https://api.example.com'
});
// Alter defaults after instance has been created
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
複製代碼
配置會以一個優先順序進行合併。這個順序是:在 lib/defaults.js
找到的庫的默認值,而後是實例的 defaults
屬性,最後是請求的 config
參數。後者將優先於前者。這裏是一個例子:
// 使用由庫提供的配置的默認值來建立實例
// 此時超時配置的默認值是 `0`
var instance = axios.create();
// 覆寫庫的超時默認值
// 如今,在超時前,全部請求都會等待 2.5 秒
instance.defaults.timeout = 2500;
// 爲已知須要花費很長時間的請求覆寫超時設置
instance.get('/longRequest', {
timeout: 5000
});
複製代碼
在請求或響應被 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);
});
複製代碼
若是你想在稍後移除攔截器,能夠這樣:
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
複製代碼
能夠爲自定義 axios 實例添加攔截器
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});
複製代碼
axios.get('/user/12345')
.catch(function (error) {
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
console.log(error.config);
});
複製代碼
Y可使用 validateStatus
配置選項定義一個自定義 HTTP 狀態碼的錯誤範圍。
axios.get('/user/12345', {
validateStatus: function (status) {
return status < 500; // Reject only if the status code is greater than or equal to 500
}
})
複製代碼
使用 cancel token 取消請求
Axios 的 cancel token API 基於cancelable promises proposal,它還處於第一階段。
可使用 CancelToken.source
工廠方法建立 cancel token,像這樣:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 處理錯誤
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// 取消請求(message 參數是可選的)
source.cancel('Operation canceled by the user.');
複製代碼
還能夠經過傳遞一個 executor 函數到 CancelToken
的構造函數來建立 cancel token:
const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函數接收一個 cancel 函數做爲參數
cancel = c;
})
});
// cancel the request
cancel();
複製代碼
注意: 可使用同一個 cancel token 取消多個請求
默認狀況下,axios將JavaScript對象序列化爲JSON。 要以application / x-www-form-urlencoded格式發送數據,您可使用如下選項之一。
在瀏覽器中,您可使用URLSearchParams API,以下所示:
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);
複製代碼
請注意,全部瀏覽器都不支持URLSearchParams(請參閱caniuse.com),但可使用polyfill(確保填充全局環境)。
或者,您可使用qs庫編碼數據:
const 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-form-urlencoded' },
data: qs.stringify(data),
url,
};
axios(options);
複製代碼
在node.js中,您可使用querystring模塊,以下所示:
const querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));
複製代碼
在axios達到1.0版本以前,破壞性更改將以新的次要版本發佈。 例如0.5.1和0.5.4將具備相同的API,但0.6.0將具備重大變化。
axios 依賴原生的 ES6 Promise 實現而被支持. 若是你的環境不支持 ES6 Promise,你可使用 polyfill. ##3 TypeScript axios包括TypeScript定義。
import axios from 'axios';
axios.get('/user?ID=12345');
複製代碼
axios深受Angular提供的、$http服務的啓發。 最終,axios是爲了在Angular以外使用而提供獨立的相似$http服的務。
/** * 全站http配置 * * axios參數說明 * isSerialize是否開啓form表單提交 * isToken是否須要token */
import axios from 'axios'
import store from '@/store/';
import router from '@/router/router'
import { serialize } from '@/util/util'
import {getToken,getRoleTitle} from '@/util/auth' // 獲取相對應的權限
import {Message} from 'element-ui' // 調用彈窗組件
import website from '@/config/website'; // statusWhiteList 經過此處,獲取白名單,默認[400]
import NProgress from 'nprogress' // progress bar vue中的進度條
import 'nprogress/nprogress.css' // progress bar style
import Cookies from 'js-cookie'
axios.defaults.timeout = 20000; // 設置超時時間
// 返回其餘狀態嗎
// 定義對於給定的HTTP 響應狀態碼是 resolve 或 reject promise 。
// 若是 `validateStatus` 返回 `true` (或者設置爲 `null` 或 `undefined`),
// promise 將被 resolve; 不然,promise 將被 rejecte
axios.defaults.validateStatus = function (status) {
return status >= 200 && status <= 500; // 默認的
};
//跨域請求,容許保存cookie
axios.defaults.withCredentials = true;
// NProgress Configuration
// 經過設置爲false關閉加載旋轉器。(默認值是ture)
NProgress.configure({
showSpinner: false
});
//HTTPrequest攔截-添加請求攔截器
axios.interceptors.request.use(config => {
NProgress.start() // start progress bar 加載器開始加載
const meta = (config.meta || {}); //
const isToken = meta.isToken === false;
if (getToken() && !isToken) {
config.headers['Admin.Authority.Token.cashloan'] = getToken();
// 'Bearer ' + getToken() // 讓每一個請求攜帶token--['Authorization']爲自定義key 請根據實際狀況自行修改
}
//headers中配置serialize爲true開啓序列化 是否開啓form表單提交
if (config.methods === 'post' && meta.isSerialize === true) {
config.data =config.data => {
let list = [];
Object.keys(data).forEach(ele => {
list.push(`${ele}=${data[ele]}`)
})
return list.join('&');
};
}
return config
}, error => {
return Promise.reject(error)
});
//HTTPresponse攔截-添加響應攔截器
axios.interceptors.response.use(res => {
NProgress.done(); // 進度條關閉
const status = Number(res.status) || 200; // 返回值必須是200
const statusWhiteList = website.statusWhiteList || []; // 白名單 400
const message = res.data.message || '未知錯誤'; // 肯定的返回值或者是'未知錯誤'
const code = res.data.code
if (code === 11002) {
Message({
message,
type: "error"
})
}
if (code === 10004) {
Message({
message: "有另外一臺設備登陸",
type: 'error'
})
store.dispatch('FedLogOut').then(() => router.push({
path: '/login'
}));
}
if (code === 10001) {
Message({
message: "請從新登陸",
type: 'error'
})
Cookies.set('loading', true)
store.dispatch('FedLogOut').then(() => router.push({
path: '/login'
}));
}
if (code === 10002) {
Message({
dangerouslyUseHTMLString: true,
message: `接口爲${res.request.custom.url}</br></br>${getRoleTitle()}沒有權限`,
type: 'error'
})
}
if (code === 10003) {
Message({
dangerouslyUseHTMLString: true,
message,
type: 'error'
})
}
if (code === 404) {
Message({
dangerouslyUseHTMLString: true,
message: `接口爲${res.request.custom.url}</br></br>${JSON.stringify(res.data)}`,
type: 'error'
})
}
if (code === 400) {
if (res.data.message.includes('/')) {
Message({
dangerouslyUseHTMLString: true,
message: message.split('/')[1],
type: 'error'
})
return
}
Message({
dangerouslyUseHTMLString: true,
message: `${JSON.stringify(res.data)}`,
type: 'error'
})
}
if (code === 500) {
if(!res.data.message.includes("TIMEOUT")){
Message({
dangerouslyUseHTMLString: true,
message:`服務器故障,請稍後重試`,
// message: `接口爲${res.request.custom.url}</br></br>${JSON.stringify(res.data)}`,
type: 'error'
})
}
}
//若是在白名單裏則自行catch邏輯處理
if (statusWhiteList.includes(status)) return Promise.reject(res);
//若是是401則跳轉到登陸頁面
if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
// 若是請求爲非200否者默認統一處理
if (status !== 200) {
Message({
message: message,
type: 'error'
})
return Promise.reject(new Error(message))
}
return res;
}, error => {
NProgress.done();
return Promise.reject(new Error(error));
})
export default axios;
複製代碼