vue中用axios post方式報錯的解決方法

前言

很多同學在用vue開發(fā)的過程中會用到axios這個包去發(fā)ajax請求,但是在用它的post方法時會發(fā)生各種各樣的問題。網(wǎng)上也有各種的答案,現(xiàn)在我整理了一下,專門對axios做了一層封裝,一般情況下,我們只用到post, get這兩種方式。其實這兩種方式按理來說并沒有多大區(qū)別,只是他們的區(qū)別是因為瀏覽器對不同的請求方式做了不同的限制處理才有區(qū)別的。

post請求后臺收不到參數(shù)的可能原因

1,沒有對要發(fā)送的數(shù)據(jù)進行序列化
  解決方案: data: qs.stringify(data)

2,沒有設置對應的post的請求頭 
   解決方案:

    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }

3,解決axios發(fā)請求不帶cookies的問題
  axios.defaults.withCredentials = true // 請求會帶cookies

發(fā)post請求時,1,2項設置必不可少

具體封裝代碼可以參考一下,新建一個ajax.js

import axios from 'axios'
import qs from 'qs' // qs這個包在install  axios 時就已經(jīng)裝了,因為 qs 是 axios 的依賴包
axios.defaults.withCredentials = true // 帶cookie請求
axios.defaults.timeout = 5000 //  請求的超時時間 5000ms

axios.post = function (url, data = {}) {
  return axios({
    method: 'post', // 請求協(xié)議
    withCredentials: true, // true時,發(fā)送請求會帶cookie,不需要帶cookie可以設置false
    url: url, // 請求的地址
    data: qs.stringify(data), // post 請求的數(shù)據(jù),很多人
    timeout: 5000, // 請求超時時間, 單位毫秒
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
  })
}

axios.get = function (url, params = {}) {
  return axios({
    method: 'get', // 請求協(xié)議
    withCredentials: true, // true時,發(fā)送請求會帶cookie,不需要帶cookie可以設置false
    url, // 請求的地址
    params, // get 請求的數(shù)據(jù)
    timeout: 5000 // 請求超時時間, 單位毫秒
  })
}

axios.interceptors.response.use(response => {
  return response.data // 只拿后臺返回的json數(shù)據(jù)
}, error => Promise.reject(error.response))

export default axios

如何用這個ajax.js

 1,可以掛載到vue的原型鏈上面去,這樣就全局通用
在主入口文件main.js里面
import ajax from './ajax.js'
import Vue from 'vue'
Vue.$ajax = ajax

然后在項目的任何組件里面可以這樣用get方式發(fā)送數(shù)據(jù):
let data = {page:1,pageSize: 10}

this.$ajax.get(url,data).then(result => {
  // 你的邏輯
}).catch(err => {
  // 你的邏輯
})

在項目的任何組件里面可以這樣用post方式發(fā)送數(shù)據(jù):
 this.$ajax.post(url,data).then(result => {
  // 你的邏輯
 }).catch(err => {
  // 你的邏輯
 })



 2,只在用到發(fā)ajax的組件用,
  import axios from './ajax.js'
  
  let data = {page:1,pageSize: 10}
 axios.get(url,data).then(result => {
  // 你的邏輯
 }).catch(err => {
  // 你的邏輯
 })

 在組件里面可以這樣用post方式發(fā)送數(shù)據(jù):
 axios.post(url,data).then(result => {
   // 你的邏輯
  }).catch(err => {
   // 你的邏輯
  })

上面的方法雖然解決了問題,但是方法不太好,已經(jīng)違反了軟件的面向?qū)ο笤O計原則:開放封閉原則。

我們要的正確做法是要在axios上擴展,而不是修改覆蓋它原有的東西。具體參考下一篇《用axios擴展出一個適合自己項目的ajax工具類》.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 最近在逛各大網(wǎng)站,論壇,以及像SegmentFault等編程問答社區(qū),發(fā)現(xiàn)Vue.js異?;鸨貜托缘奶釂柡蛢?nèi)容...
    忘川慕白閱讀 6,137評論 7 113
  • 清晨上班坐在電腦電腦前時,看著別人發(fā)表的一篇篇小文章。雖然有些文字并沒有多么的唯美,然而卻散發(fā)著一絲絲生活的...
    背著行囊上路的貓閱讀 455評論 0 0
  • 坐在地鐵上想到昨晚睡前的一幕便忍不住笑了…… 10點陪xuan躺在床上默念單詞,他說渴了,“叫爸爸給你拿杯水”,他...
    hagar閱讀 285評論 0 0
  • 古今逢秋倍思親 古今逢秋倍思親 我親乘風化繁星 明月相照來作證 天上人間永恒心
    一葉漁舟閱讀 274評論 2 1
  • vocabulary abjureabandonabnormaljuryjudgeadjureconjurecon...
    真像大白閱讀 916評論 0 50

友情鏈接更多精彩內(nèi)容