Axios 框架的網絡模塊封裝

什么是 Axios?

Axios 是一個基于 promise 的 HTTP 庫, 可以用在瀏覽器和 Node.js 中

Axios的作用是什么呢: Axios主要是用于向后臺發起網絡請求的, 并且可以在請求中做更多的可控操作

簡單來說: Axios就是一種前端向后端發送網絡請求的工具

網絡模塊的選擇

傳統的 Ajax

  • 傳統的 Ajax 基于 XMLHttpRequest(XHR)
  • 之所以不用它, 是因為它配置和調用方式等非?;靵y, 編碼起來看起來令人十分頭疼
  • 真實開發中很少直接使用傳統的 Ajax, 而是使用 jQuery版的Ajax

jQuery-Ajax

  • jQuery-Ajax 相對于傳統的 Ajax 非常好用
  • 之所以不用它, 是因為 jQuery 是一個重量級的框架, 代碼有 1w+ 行, 而 Vue 的代碼也是 1w+ 行, 所以沒必要為了網絡請求, 特意引用一個 jQuery

Vue-Resource

  • 官方在 Vue1.x 的時候, 推出了 Vue-Resource
    Vue-Resource 的體積相對于 jQuery 小很多
  • 之所以不用它, 是因為在 Vue2.0 推出后, Vue 的作者就在 GitHub 的 Issues 中說明了去掉 Vue-Resource, 并且以后也不會再更新, 意味著以后 Vue-Reource 不再支持新的 Vue 版本, 也不會再繼續更新和維護, 對以后的項目開發和維護都存在很大的隱患

Axios

  • 在說明不再繼續更新和維護 Vue-Resource 的同時, 作者(尤雨溪) 還推薦了一個框架: Axios

  • Axios有非常多的優點, 并且用起來也非常方便

Axios 使用

安裝

npm install axios --save

Axios 雖然是一個插件, 但是我們不需要通過 Vue.use(axios) 來使用, 下載完成后, 只需在項目中引入即可, 至于為什么, 我認為應該是因為開發者在封裝 Axios 時, 沒有寫 install 這一步

Axios 的特性

  • 在瀏覽器中發送 XMLHttpRequests 請求
  • 在 Node.js 中發送 HTTP 請求
  • 支持 Promise API
  • 攔截請求和響應
  • 轉換請求和響應數據

Axios 請求方式

  • axios(config)
  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])

發送 get 請求

image

發送并發請求

使用 axios.all, 可以放入多個請求的數組

axios.all([]) 返回的結果是一個數組, 使用 axios.spread 可將數組 [res1,res2] 展開為 res1, res2

axios.all([
  axios.get('http://123.207.32.32:8000/home/multidata'),
  axios.get('http://123.207.32.32:8000/home/data', {
    params: { 
      type: 'sell',
      page: 1 
    } 
  })
]).then(axios.spread((res1, res2) => {
  console.log(res1)   // 第一個請求的數據
  console.log(res2)   // 第二個請求的數據
}))

全局配置

在開發中, 可能很多參數都是固定的, 例如請求的 URL 前面某些部分總是一致的, 只是后面的參數或是 query 不同
這個時候, 我們可以進行一些抽取, 也可以利用 Axios 的全局配置

例如:

  • http://123.207.32.32:8000/home/multidata
  • http://123.207.32.32:8000/home/data?type=sell&page=1

我們發現前面的http://123.207.32.32:8000總是一樣的, 那么就可以進行全局配置

注: /home并不是完全一致, /home只是在某個頁面的數據, 并不能代表全部, 有可能做某個頁面的時候就不再是/home, 而是/category

image

配置請求頭 Content-Type

Axios 使用 post 發送數據時, 默認是直接把 json 放到請求體中提交到后端的
也就是說, 我們的 Content-Type 變成了 application/json;charset=utf-8, 這是 Axios 默認的請求頭content-type類型
但是實際我們后端要求的 'Content-Type': 'application/x-www-form-urlencoded' 為多見, 這就與我們不符合

所以很多小伙伴在這里犯錯誤, 導致請求數據獲取不到, 明明自己的請求地址和參數都對了卻得不到數據

我們現在來說說 post 請求常見的數據格式(content-type)

  • Content-Type: application/json
    • 請求體中的數據會以json字符串的形式發送到后端
  • Content-Type: application/x-www-form-urlencoded
    • 請求體中的數據會以普通表單形式(鍵值對)發送到后端
  • Content-Type: multipart/form-data
    • 它會將請求體的數據處理為一條消息, 以標簽為單元, 用分隔符分開, 既可以上傳鍵值對, 也可以上傳文件

常見的配置選項

  • 請求地址 : url: '/user'
  • 請求類型 : method: 'get'
  • 請求路徑 : baseURL: 'http://'
  • 請求的數據處理 : transformRequest: [function(data){}]
  • 請求的數據處理 : transformResponse: [function(data){}]
  • 自定義的請求頭 : headers: {'x-Requested-With' : * 'XMLHttpReqyest'}
  • URL查詢對象 : params: {id: 12}
  • 查詢對象序列化函數 : paramsSerializer: function(params) {}
  • request body : data: {key: 'aa'}
  • 超時設置 : timeout: 1000
  • 跨域是否帶 token : withCredentials: false
  • 自定義請求處理 : adapter: function(resolve, reject, * config) {}
  • 身份驗證信息 : auth: {uname: '', pwd: '12'}
  • 響應的數據格式 : responseType : 'json'
    • json
    • blob
    • document
    • arraybuffer
    • text
    • stream

Axios 實例

為什么要創建 Axios 的實例呢?

當我們從 Axios 模塊中導入對象時, 使用的實例是默認的實例, 當給該實例設置一些默認配置時, 這些配置就被固定下來了
但是后續開發中, 某些配置可能會不太一樣, 比如某些請求需要使用特定的 baseURL 或者 timeout 或者 content-Type 等, 這時我們就可以創建新的實例, 并且傳入屬于該實例的配置信息, 這里推薦使用實例的方式, 而不使用全局的方式

import axios from 'axios'

// 創建新的實例
const instance = axios.create({
  baseURL: 'http://123.207.32.32:8000',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})

// 發送網絡請求
instance({
  url: '/category',
  method: 'get'
}).then(res => {
  console.log(res);
}).catch(err => {
  console.log(err);
})

Axios 封裝

為什么要封裝呢? 萬一哪天這個框架不維護了呢?
那維護項目就只能加班加點了 (通宵警告), 所以封裝后的代碼更易維護

封裝有多種方式, 這里展示個人認為比較優美的封裝方式

image
image
image

攔截器

Axios 提供了攔截器, 用于我們每次發送請求或者得到請求響應后, 進行對應的處理, 例如有些頁面或功能需要用戶登陸模式才可以訪問, 那此時就可以在用戶請求頁面時利用攔截器做登陸驗證了

image
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容

  • AJAX 在瀏覽器端進行網絡編程(發送請求、接收響應)的技術方案 以通過 JavaScript 直接獲取服務端最新...
    Aaron胖虎閱讀 286評論 0 1
  • 在vue項目中,和后臺交互獲取數據這塊,我們通常使用的是axios庫,它是基于promise的http庫,可運行在...
    lan1997閱讀 1,370評論 0 1
  • vue中Axios的封裝和API接口的管理 我們所要的說的axios的封裝和api接口的統一管理,其實主要目的就是...
    奧雷里亞諾下劃線_上校閱讀 892評論 0 3
  • 前言: 在一開始前后臺交互過程中,我們一般都是使用傳統的ajax進行交互,傳統ajax 指的是XMLHttpRe...
    延飛閱讀 2,574評論 0 4
  • 一、axios的封裝 在vue項目中,和后臺交互獲取數據這塊,我們通常使用的是axios庫,它是基于promise...
    張先覺閱讀 1,807評論 1 12