最近,在Vue前端調試http請求,無論如何如何也是攔截不了某些http請求。場景是這樣的:Java后端組裝好Vue對象,然后送到前端,前端通過id來掛載該Vue對象,而該對象中有上傳文件或者圖片的控件,正是對這些控件的http請求是無法攔截的,所以導致沒發設置請求頭信息。后來經過對這一場景的梳理,有了一些心得,現記錄如下。
在Vue前端開發時,可以通過id來掛載Vue對象,從而展示界面;要是這種對象都是在前端生成的話,那么處理起來很方便;要是該對象是從后端通過Java組裝生成的並傳輸過來的話,那么有些地方或者是細節方面就需要注意了;現列舉如下,以供后續參考,下面所說的Vue對象都來自后端組裝生成而來。
(1)在該Vue對象中所有的http請求都不要直接采用axios對象,而是采用this.$http的方式,注意了$http是主工程中Vue的一個全局屬性,可以在主工程中這樣添加:Vue.property.$http = axios;在被掛載的Vue對象為啥要用全局方式this.$http呢?這樣做的好處是方便被主工程的攔截器攔截,同時也可以繼承主工程的請求頭信息;若是直接采用axios對象的話,那么在主工程中是無法攔截的,更沒發繼承主工程的請求頭信息了。
(2)在該Vue對象中若是需要一些額外的數據,可以通過全局屬性獲取,也可以通過Vue對象的屬性來綁定,最好是通過一個對象的方式來綁定屬性。
(3)在該Vue對象中若是用到element的upload組件的話,那么該http請求是不會被主工程攔截器所攔截的,並且也不會繼承主工程中的請求頭信息;所以當需要相關的請求頭信息時要買通過全局屬性來獲取,要么通過數據綁定來獲取;建議還是通過數據綁定來處理比較合適,比如說需要請求頭信息,可以在被掛載的Vue對象中建立一個headers屬性,類型為Object,默認值為{},這樣在掛載主工程某個節點時可以通過數據綁定headers屬性來傳給被掛載的Vue對象,以后需要添加請求頭信息,只要在主工程中添加然后綁定給headers屬性就可以了,而被掛載的Vue對象根本就不用感知有哪些請求頭信息,它只負責填充和傳輸。
此外,在Vue中添加對http的攔截器,可以參考下面示例:
import axios from 'axios'
axios.interceptors.request.user(function(config)) {
// 這里可以進行請求之前的處理
}
axios.interceptors.response.user(function(config)) {
// 這里可以進行響應之后的處理
}
------20191225閃🚶