1. 程式人生 > >Vue2.0筆記——Ajax,JSONP跨域

Vue2.0筆記——Ajax,JSONP跨域

Vue

Ajax實現

vue本身不支持發送AJAX請求,需要使用vue-resource、axios等插件實現。
axios是一個基於Promise的HTTP請求客戶端,用來發送請求,也是vue2.0官方推薦的,同時不再對vue-resource進行更新和維護。
參考GitHub上的axios,dist目錄下的文件就是axios.min.js。
語法:

axios([options])
axios.get(url[,options])
    傳參方式:
        1.通過url傳參
        2.通過params選項傳參

案例:axios([options])

data:{
            id:1001
        },
    methods:{
            sendAjax(){
                axios({
                    method:‘get‘,
                    url:‘https://api.github.com/users/‘ + vm.id
                }).then(function(resp){ //表示請求成功,將執行的回調函數
                    console.log(resp.data);
                    vm.user=resp.data;
                }).catch(function(){  //請求失敗,將執行的回調函數
                    console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText);
                });
            }
        }

在這個代碼中,github是一個開源網站,所以可以訪問到用戶的信息。
1.vm.id表示vm引用當前Vue實例的屬性,在後面Vue實例中說明。
2.axios表示執行ajax請求,method選項表示請求方式,url表示請求路徑。
3..then回調函數,表示請求成功將被執行,resp為請求成功返回的數據。
4.catch表示請求失敗將被執行的回調函數。。

axiso.get(url[,options])

與其類似,但需要註意,第一個參數為url,後面才是選項。

sendAjaxGet(){
                axios.get(‘/user‘,{
                    params:{
                        id:1001
                    }
                }).then(function(resp){
                    console.log(resp.data);
                    vm.user=resp.data;
                }).catch(function(){
                    console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText);
                });
            }

axios.post(url,data,[options])

post方式請求,第一個參數為請求路徑,第二個參數直接就是需要傳遞的數據,格式為json格式,後面的為選項。

sendAjaxPost(){
    axios.post(‘server.php‘,{
        name:‘KaiEr‘,
        age:19
    }).then(function(resp){
        console.log(resp.data);
    }).catch(function(){
        console.log(‘請求失敗‘ + resp.status + ‘,‘ + resp.statusText);
    });
}

還有其他的Request Config請求配置
如:transformRequest

transformRequest: [function (data, headers) {
    // Do whatever you want to transform the data
    return data;
  }],

按照文檔的意思是說,在請求數據發到服務器之前對其進行更改,僅適用於‘PUT‘,‘POST‘和‘PATCH‘。
該值為數組, 數組中最後一個函數應返回一個字符串或Buffer,ArrayBuffer實例。其實返回字符串就可以。
該函數接收的data參數表示傳遞的數據,即post方式請求的第二個參數。
<br/>
還有如

  • timeout:表示請求超時的毫秒數
  • heads:自定義頭部文件
  • responseType:響應類型
  • responseEncoding:響應編碼格式

等等,都可以在Github的axios項目的README.md文件中查看文檔。
GitHub的axios開源項目

JSONP跨域請求

axios本身並不支持發送跨域的請求,沒有提供相應的API。
盡管vue-resource不再維護,但是還可以使用它來進行跨域請求。
您可以考慮使用Jquery.js來進行跨域請求和Ajax請求。然而還有其他使用ajax跨域的更好方法。我們只是說明Vue也可以支持此功能,但如果需要,你任然可以選擇。

引入vue-resource.js文件,可以訪問Github的vue-resource項目
文檔語法:

this.$http.jsonp(‘/someUrl‘, [config]).then(successCallback, errorCallback);
this.$http.get(‘/someUrl‘, [config]).then(successCallback, errorCallback);
  • get(url, [config])
  • head(url, [config])
  • delete(url, [config])
  • jsonp(url, [config])
  • post(url, [body], [config])
  • put(url, [body], [config])
  • patch(url, [body], [config])

Example:

{
  // GET /someUrl
  this.$http.get(‘/someUrl‘).then(response => {
    // get body data
    this.someData = response.body;
  }, response => {
    // error callback
  });
}

案例:
通過跨域請求Baidu的搜索,打開百度,F12,輸入a字符,搜索,Ajax請求,network中找到這樣一條請求。
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1444_12897_21084_26182_22158&req=2&csor=1&cb=jQuery110209410333632536945_1523889174484&_=1523889174489

wd代表搜索的單詞a,我們只需要前邊的。
另外我們可以在heads中看到百度使用的jsonp參數名為cb,所以需要修改。

sendJsonp(){
    this.$http.jsonp(‘https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su‘,{
        params:{
            wd:‘a‘
        },
        jsonp:‘cb‘ //百度使用的jsonp參數名為cb,所以需要修改
        }).then(resp => {
            console.log(resp.data.s);
        });
}

通過測試,發現可以得到結果

(10)?["愛奇藝", "阿裏雲", "安居客", "阿裏巴巴", "阿裏巴巴批發網", "愛奇藝網", "阿裏雲郵箱", "安卓模擬器", "愛思助手", "acfun"]

文檔訪問Github的vue-resource項目

另外,我也不怎麽建議使用這個跨域,況且也不是經常用到。
可以使用Jquery,document.domain + iframe跨域以及nodejs中間件代理跨域

Vue2.0筆記——Ajax,JSONP跨域