Axios
是一個基於 promise
的 HTTP
庫,能夠用在瀏覽器和 node.js
中。node
主要的做用:axios
主要是用於向後臺發起請求的,還有在請求中作更可能是可控功能。ios
axios有8個特性npm
Promise API
JSON
數據XSRF
安裝十分簡單,使用 npm
:axios
npm install axios
案例
執行 GET
請求api
axios .get("請求地址", { // 拼接參數寫在params中 params: { ID: 12345, }, }) // 成功後作的事情 .then(function (response) { console.log(response); }) // 失敗後作的事情 .catch(function (error) { console.log(error); });
執行POST
請求數組
axios .post("請求地址", { firstName: "jkc", lastName: "123", }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
執行併發請求,當咱們想要同時發出2個請求,能夠使用axios.all()
promise
function getUserAccount() { return axios.get("/user/12345"); } function getUserPermissions() { return axios.get("/user/12345/permissions"); } axios.all([getUserAccount(), getUserPermissions()]).then((res) => { console.log(res); });
以上代碼咱們先定義了2個方法,每一個方法都會發送一個請求,最後把2個方法都放在數組中,這樣程序就會同時執行2個方法,且最後的結果是在數組中,結果以下:
上面返回的結果是在數組中,到時候取結果的時候就要用res[0]
,若是你以爲這樣麻煩,若是咱們想展開的話,能夠使用axios.spread
方法瀏覽器
axios.all([getUserAccount(), getUserPermissions()]).then( axios.spread((res1, res2) => { console.log(res1); console.log(res2); }) );
此時,咱們返回的結果就不是一個數組了,會分開來,結果以下:
服務器
如下是建立請求時能夠用的配置選項。只有 url
是必需的。若是沒有指定 method
,請求將默認使用 get
方法。網絡
{ // `url` 是用於請求的服務器 URL url: '/user', // `method` 是建立請求時使用的方法 method: 'get', // default // `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL。 // 它能夠經過設置一個 `baseURL` 便於爲 axios 實例的方法傳遞相對 URL baseURL: 'https://some-domain.com/api/', // `headers` 是即將被髮送的自定義請求頭 headers: {'X-Requested-With': 'XMLHttpRequest'}, // `params` 是即將與請求一塊兒發送的 URL 參數 // 必須是一個無格式對象(plain object)或 URLSearchParams 對象 params: { ID: 12345 }, // `data` 是做爲請求主體被髮送的數據 // 只適用於這些請求方法 'PUT', 'POST', 和 'PATCH' data: { firstName: 'Fred' }, // `timeout` 指定請求超時的毫秒數(0 表示無超時時間) // 若是請求話費了超過 `timeout` 的時間,請求將被中斷 timeout: 1000, // `auth` 表示應該使用 HTTP 基礎驗證,並提供憑據 // 這將設置一個 `Authorization` 頭,覆寫掉現有的任意使用 `headers` 設置的自定義 `Authorization`頭 auth: { username: 'janedoe', password: 's00pers3cret' }, }
響應結構
發送網絡請求成功後,返回的響應結構以下:
{ // `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: {} }
配置默認值
配置網絡請求時,你能夠指定將被用在各個請求的配置默認值
axios.defaults.baseURL = 'https://api.example.com'; // 配置默認的baseURL axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; // 配置默認請求頭中的Authorization axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; // 配置默認的post請求方式
// 建立實例時配置默認值 const instance = axios.create({ baseURL: 'https://api.example.com' }); // 建立實例後更改默認值 instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
攔截器
在請求或響應被 then
或 catch
處理前攔截它們。
// 2.1.請求攔截器 instance.interceptors.request.use( (config) => { console.log(config); // 1.好比config中的一些信息不符合服務器的要求 // 2.好比每次發送網絡請求時,都但願在界面中顯示一個請求的圖標 // 3.某些網絡請求(好比登陸(token)),必須攜帶一些特殊的信息 return config; }, (error) => { console.log(error); } ); // 2.2.響應攔截 instance.interceptors.response.use( (res) => { return res.data; }, (error) => { console.log(error); } );
項目中axios完整的封裝
在真實項目開發中,咱們會在src
文件夾中建立一個utils
文件夾,而後在文件夾中建立一個request.js
文件,寫入以下代碼:
import axios from "axios"; export function request(config) { // 1.建立axios的實例 const instance = axios.create({ baseURL: "http://xxx.xxx.xx.xx:8000", timeout: 5000, }); // 2.1.請求攔截器 instance.interceptors.request.use( (config) => { console.log(config); // 1.好比config中的一些信息不符合服務器的要求 // 2.好比每次發送網絡請求時,都但願在界面中顯示一個請求的圖標 // 3.某些網絡請求(好比登陸(token)),必須攜帶一些特殊的信息 return config; }, (error) => { console.log(error); } ); // 2.2.響應攔截 instance.interceptors.response.use( (res) => { return res.data; }, (error) => { console.log(error); } ); // 3.發送真正的網絡請求 return instance(config); }
最後咱們在main.js
中給網絡請求配置下全局屬性便可
import { request } from "@/utils/request"; Vue.prototype.$request = request;
這樣之後,咱們在任何目錄下,均可以直接使用request
網絡請求,不須要每次都導入了