axios使用心得總結

Axios是一個基於Promise的 HTTP 庫,能夠用在瀏覽器和node.js 中,由於尤大大的推薦,axios也變得愈來愈流行。最近項目中使用axios也遇到了一些問題,就藉此機會總結一下,若有錯誤,還請不吝指正。node

功能

  • 瀏覽器端發起XMLHttpRequests請求
  • node層發起http請求
  • 支持Promise API
  • 攔截請求響應
  • 轉換請求響應數據
  • 取消請求
  • 自動轉換JSON數據
  • 客戶端支持防護XSRF(跨站請求僞造)

兼容

圖片描述

使用

npmios

npm install axiosgit

bowergithub

bower install axiosnpm

cdnjson

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>axios




發起請求segmentfault

GET

axios.get('/user?ID=123')
    .then( res => {
         // 請求數據成功並返回數據。
        console.info(res)
    }).catch( e => {
        if(e.response){
        //請求已發出,服務器返回狀態碼不是2xx。
            console.info(e.response.data)
            console.info(e.response.status)
            console.info(e.response.headers)
        }else if(e.request){
            // 請求已發出,但沒有收到響應
            // e.request 在瀏覽器裏是一個XMLHttpRequest實例,
            // 在node中是一個http.ClientRequest實例
            console.info(e.request)
        }else{
            //發送請求時異常,捕捉到錯誤
            console.info('error',e.message)
        }
        console.info(e.config)
    })
// 等同如下寫法
axios({
    url: '/user',
    method: 'GET',
    params: {
        ID: 123
    }
}).then( res => {
    console.info(res)
}).catch( e => {
    console.info(e)
})

POST

axios.post('/user', {
    firstName: 'Mike',
    lastName: 'Allen'
}).then( res => {
    console.info(res)
}).catch( e => {
    console.info(e)
})
// 等同如下寫法
axios({
    url: '/user',
    method: 'POST',
    data: {
        firstName: 'Mike',
        lastName: 'Allen'
    }
}).then( res => {
    console.info(res)
}).catch( e => {
   console.info(e)
})

注意事項

在使用GET方法傳遞參數時使用的是params,而且官方文檔中介紹爲:params are the URL parameters to be sent with the request. Must be a plain object or a URLSearchParams object。譯爲:params做爲URL連接中的參數發送請求,且其必須是一個plain object或者是URLSearchParams objectplain object(純對象)是指用JSON形式定義的普通對象或者new Object()建立的簡單對象;而URLSearchParams object指的是一個能夠由URLSearchParams接口定義的一些實用方法來處理 URL 的查詢字符串的對象,也就是說params傳參是以/user?ID=1&name=mike&sex=male形式傳遞的。瀏覽器

而在使用POST時對應的傳參使用的是datadata是做爲請求體發送的,一樣使用這種形式的還有PUT,PATCH等請求方式。有一點須要注意的是,axiosPOST的默認請求體類型爲Content-Type:application/json(JSON規範流行),這也是最多見的請求體類型,也就是說使用的是序列化後的json格式字符串來傳遞參數,如:{ "name" : "mike", "sex" : "male" };同時,後臺必需要以支持@RequestBody的形式接收參數,不然會出現前臺傳參正確,後臺接收不到的狀況。
若是想要設置類型爲Content-Type:application/x-www-form-urlencoded(瀏覽器原生支持),axios提供了兩種方式,以下:服務器

瀏覽器端

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

不過,並非全部瀏覽器都支持URLSearchParams兼容性查詢caniuse.com,可是這裏有一個Polyfill (polyfill:用於實現瀏覽器並不支持的原生API的代碼,能夠模糊理解爲補丁,同時要確保polyfill在全局環境中)。
或者,你也能夠用qs這個庫來格式化數據。默認狀況下在安裝完axios後就可使用qs庫。

const qs = require('qs');
axios.post('/user', qs.stringify({'name':'mike'}));

node層

node環境中可使用querystring。一樣,也能夠用qs來格式化數據。

const querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({'name':'mike'}));

補充

常見的請求體類型還有一種方式,即multipart/form-data(瀏覽器原生支持),也就是提交表單數據經常使用的一種格式。和x-www-form-urlencoded對比起來,後者則是數據被編碼成以 '&' 分隔的鍵-值對, 同時以 '=' 分隔鍵和值。非字母或數字的字符會被Percent-encoding(URL encoding),這也就是爲何這種類型不支持二進制數據的緣由 (應使用 multipart/form-data 代替)。

END

本文只是總結了axios中一些經常使用的知識點,也是本人平時在開發中遇到過的問題,因此還有些node層的應用以及其餘使用場景沒有涉及到,更詳細的配置請移步axios官方文檔,另,推薦一篇翻譯不錯的中文文檔axios譯

相關文章
相關標籤/搜索