關於axios會發送兩次請求,有個OPTIONS請求的問題

當時項目爲了解決這個問題自閉了一個下午.....上網找了不少的文章看,幾乎都沒有根治方法,可是最後仍是被我搞定了
[]~( ̄▽ ̄)~* ios

問題描述:

Vue的開發者都知道axios,不少都用axios來進行數據交互,axios的默認請求頭是Content-Type: application/json
使用這個請求頭會出現向服務器請求兩次的狀況
爲何呢?npm

緣由是:瀏覽器會首先使用 OPTIONS 方法發起一個預請求,判斷接口是否可以正常通信,若是不能就不會發送真正的請求過來,若是測試通信正常,則開始真正的請求。json

大概意思就是:
瀏覽器對後臺說:我能夠請求你嗎? ( ̄ˇ ̄) 
後臺說:闊以。( ̄▽ ̄)~*
結果是:發送原有的POST請求
後臺說:不闊以。(‵﹏′)
結果是:報錯axios

那麼這樣每一個請求都會發送兩次,無形加劇了服務器的負擔(若是服務器特厲害就當我沒說),網上有的解決辦法是讓後臺容許options請求,可是並不返回任何數據,那麼就不會報錯,但是這樣治標不治本,瀏覽器仍是來撩後臺了,只是後臺不讓撩而已。
如何解決這個問題?不容許瀏覽器請求,只發送真正的請求,我也沒解決,若是有已經解決的朋友能夠告訴我解決方法
~( ̄3 ̄)~瀏覽器

可是!

我有能夠替代的方法
那就是在main.js中,設置axios的默認請求頭axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';服務器

但是問題又來了

圖片描述後臺不認這個數據格式啊...app

因此在傳遞的時候必須先把數據轉換格式post

這時候咱們須要用到qs模塊
npm install qs測試

在main.js中

引入qs模塊this

import qs from 'qs

而後弄qs原型

Vue.prototype.$qs = qs

這樣咱們就能夠在axios post請求的時候將咱們傳遞的數據轉換成後臺認識的格式

this.$axios
     .post("http://xxx/", 
        this.$qs.stringify(postData)
      ).then(data => {
        if (data.data.status != 200) {
          //xxx
        } else {
          //xxx
        }
      });

這樣就完美解決問題,減小了對服務器的請求,減輕了對服務器的壓力,最重要的是可!以!傳!

若是有什麼疑問歡迎留言,有錯誤或者有更簡單的方法歡迎大力指出

相關文章
相關標籤/搜索