前後端數據交互,axios和jquery ajax的區別

axios作爲Vue生態系統中濃墨重彩的一筆,我學習這個東西也是花了一定的時間的。剛開始的時候,也是遇到了很多問題。

逐漸摸透了它的脾氣。

首先說說FormData和Payload兩種數據格式的區別:

先是提交一個FormData的請求試試看:

然後我們看後端:

然後我們提交一個以Payload傳輸數據的請求:

我們再切到後臺:

這就是使用axios和jquery ajax最大的區別。

jquery提交數據的時候,默認是以FormData的形式提交的,也就是Content-Type:"application/x-www-form-urlencoded",

而默認axios是使用的是Payload形式提交數據,也就是Content-Type:"application/json"

如何切換呢,我們需用應用以下方式:

var params = new URLSearchParams();  

params.append('param1', 'value1');  

params.append('param2', 'value2');  

它的意思,其實就是把這樣的數據(對象){ name:"yangxu",age:23 } 轉換成這樣的數據(字符串) "name=yangxu&age=23"這樣的查詢字符串。

 

如果我們每次需要傳遞數據的時候,都這樣寫,是很複雜的,於是,我們可以進行一次全局配置,將請求數據按照需求進行相應的轉化:

 

import Vue from 'vue'  

import querystring from 'querystring'  

import axios from "axios"  

export const baseURL = process.env.NODE_ENV === 'production' ? '/' : '/api';  

  

export const http = axios.create({  

   baseURL: baseURL,  

   timeout: 10000,  

    withCredentials: true,  

    headers: {'X-Requested-With': 'XMLHttpRequest'},  

    transformRequest: [data => {  

           return querystring.stringify(data);  

    }]  

});  

 

然後,我們可以把這個axios的實例掛在到Vue的原型上:Vue.prototype.$http=http;

然後在Vue的組件裏面,就可以這樣用:

 

this.$http.post('/Home/GetInfo',{  

sName:"yangxu",  

 sId:20  

})  

  .then(function (response) {  

  console.log(response);  

})  

 .catch(function (error) {  

 console.log(error);  

 });  

 

這樣,問題雖然解決了,我們需要進行反思。

FormData和Payload傳輸數據應用場景:我個人根據自己的實際開發進行總結得出,如果前臺提交給後臺的數據是確定的(什麼是確定的,就是你提交的數據格式不會因爲用戶的操作而改變,如可選項,用戶填寫了那麼提交,沒就不提交,後臺接收是可空類型),如果是不確定的(比如我用戶點擊一個操作,就必須新增一條數據,後臺記錄的是前臺提交過去的數組),此時可以採用Payload形式提交。總之,根據自己的業務選擇合適的數據提交方式。

有一種特殊的業務場景,就是需要進行文件上傳的時候,此時我們只能採用Payload的形式上傳。

先看業務場景截圖:

我們想在上傳文件的時候,並且同時帶給後端一些數據,那麼,我們採用HTML5提供的FormData API,這個對象比較特殊,不要嘗試破壞它的結構,否則是無法上傳的,具體的使用方式請參考MDN。

此時,我們需要對我們的transformRequest方法進行一些修改:

我們在調用的時候,手動指定Content-Type爲“application/json”,告訴axios不要對我們的數據進行任何操作即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章