Vue使用Axios實現(xiàn)http請求以及解決跨域問題


Axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。Axios的中文文檔以及github地址如下:

中文:https://www.kancloud.cn/yunye/axios/234845github:https://github.com/axios/axios

vue路由文檔:https://router.vuejs.org/zh/

一、安裝Axios插件

npm install axios --save

二、在main.js中引入Axios庫

import Axios from "axios"

//將axios掛載到原型上

Vue.prototype.$axios = Axios;

//配置全局的axios默認值(可選)

axios.defaults.baseURL = 'https://api.example.com';

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

三、使用get方式的http請求

this.$axios.get("請求url",{param:{}})

? ? ? ? ? .then(function(response){

? ? ? ? ? ? ? ? ? console.info(response.data);

? ? ? ? ? ? ? ? })

? ? ? ? ? .catch(function(error){

? ? ? ? ? ? ? ? ? console.info(error);

? ? ? ? ? ? ? ? });

四、使用post方式的http請求

this.$axios.post("請求路徑",{})

? ? ? ? ? .then(function(response){

? ? ? ? ? ? ? ? ? console.info(response.data);

? ? ? ? ? ? ? ? })

? ? ? ? ? .catch(function(error){

? ? ? ? ? ? ? ? ? console.info(error);

? ? ? ? ? ? ? ? });

注意:使用上述post方式提交參數的時候存在問題,axios中post的請求參數格式是form-data格式。而上述json串的格式為x-www-form-urlencoded格式

例如:

form-data:?name="zhangsan"&age=10?

x-www-form-urlencoded:{name:"zhangsan",age:10}

此時我們需要將數據格式作轉換,在當前頁面引入第三方庫qs

import qs from "qs"

此時上述參數改為:

this.$axios.post("請求路徑",qs.stringify({}))

? ? ? ? ? .then(function(response){

? ? ? ? ? ? ? ? ? console.info(response.data);

? ? ? ? ? ? ? ? })

? ? ? ? ? .catch(function(error){

? ? ? ? ? ? ? ? ? console.info(error);

? ? ? ? ? ? ? ? });

五、Axios的攔截器

? 攔截器在main.js中進行配置,配置如下:

// 添加請求攔截器

axios.interceptors.request.use(function (config) {

? ? // 在發(fā)送請求之前做些什么

? ? return config;

? }, function (error) {

? ? // 對請求錯誤做些什么

? ? return Promise.reject(error);

? });

// 添加響應攔截器

axios.interceptors.response.use(function (response) {

? ? // 對響應數據做點什么

? ? return response;

? }, function (error) {

? ? // 對響應錯誤做點什么

? ? return Promise.reject(error);

? });

基于以上的攔截器,我們可以對請求的數據或者是響應的數據做些處理,就拿上面post方式的請求參數格式舉個例子,通過攔截器我們可以對所有的post方式的請求參數在發(fā)出請求之前作出轉換:

import qs from "qs"

// 添加請求攔截器

axios.interceptors.request.use(function (config) {

? ? // 參數格式轉換

? ? if(config.method=="post"){

? ? ? ? config.data = qs.stringify(config.data);

? ? }

? ? return config;

? }, function (error) {

? ? // 對請求錯誤做些什么

? ? return Promise.reject(error);

? });

? 因此基于攔截器我們在post請求的時候可以直接使用from-data的格式,不需要每次都編碼轉換

?六、前端跨域解決方案(了解)

描述:由于使用vue腳手架的目的就是使前后端分離,前端請求后端的數據在測試階段設計到跨域請求問題,在前端中我們可以通過如下配置解決跨域請求問題。

? 第一步(在config文件夾下的index.js中進行如下修改)

proxyTable:{

? ? "/api":{

? ? ? ? target:"后端提供服務的前綴地址",

? ? ? ? changeOrigin:true,

? ? ? ? pathRewrite:{

? ? ? ? ? ? ? '^/api':''

? ? ? ? }

? ? }

},

? 第二步(在main.js中添加一個代理)

Vue.prototype.HOST='/api'

?再進行請求的時候只需要使用url = this.HOST+"請求的Mappering地址"即可。

(注意:在上述過程中修改了config下的配置文件,服務需要重新啟動,才能生效)

例如:

1:打開config/index.js

module.exports{

????dev: {

????}

}

在這里面找到proxyTable{},改為這樣:

proxyTable: {

??????'/api': {

????????target:?'http://121.41.130.58:9090',//設置你調用的接口域名和端口號 別忘了加http

????????changeOrigin:?true,

????????pathRewrite: {

??????????'^/api':?''//這里理解成用‘/api’代替target里面的地址,后面組件中我們掉接口時直接用api代替 比如我要調用'http://40.00.100.100:3002/user/add',直接寫‘/api/user/add’即可

????????}

??????}

????}

2:在需要調接口的組件中這樣使用:

axios.post('/api/yt_api/login/doLogin',postData)

????.then(function (response) {

????????console.log(1)

????????console.log(response);

????})

????.catch(function (error) {

????????console.log(error);

????})

 注意:原接口:http://http://121.41.130.58:9090/yt_api/login/doLogin

頁面調用:http://localhost:8081/api/yt_api/login/doLogin ——這里多了一個/api/不是多余的,不要刪


七?axios傳參

1:Vue官方推薦組件axios默認就是提交 JSON 字符串,所以我們要以json字符串直接拼接在url后面的形式,直接將json對象傳進去就行了

let postData = {

companyCode:'tur',

userName:'123456789123456789',

password:'123456'

}

axios.get('/api/yt_api/login/doLogin',{

params: {

...postData,

}

})

.then(function (response) {

console.log(1)

console.log(response);

})

.catch(function (error) {

console.log(error);

});

這里我們將postData這個json對象傳入到post方法中,頁面中的形式為:


2:以key:val的形式傳參

let?postData = qs.stringify({

????companyCode:'tur',

????userName:'123456789123456789',

????password:'123456'

})

我們需要對這個json對象操作,這里的qs你需要先安裝

1npm install qs

再導入

1import qs?from?'qs'

面中的形式為:

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

推薦閱讀更多精彩內容