2-1 用axios發送HTTP請求-發送AJAX請求


目錄:

  • 簡介
  •  用axios發送AJAX請求:axios([options]),axios.get(url[,options]),axios.post(url,data,[options])
  • axios不支持跨域

一、簡介

Vue本身不只是ajax請求,需要使用vue-resource(1.0已經停止維護)、axios(2.0官方推薦)等插件實現。

axios是一個基於Promise的HTTP請求客戶端,用來發送請求,也是Vue2.0官方推薦的,同時不再對vue-resource進行更新和維護。

我們查看一下 axios的github的官方地址:axios的Github地址(這個里面有很詳細的axios的使用方法),也可以在  百度文本框: GitHub axios。

如圖:

 

二、用axios發送AJAX請求

2.1、安裝axios並引入

npm install axios -S

也可以直接下載axios.min.js文件

2.2、基本用法

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

2.3、axios([options])用法

語法:

//1、get的請求方法
axios({
    method: "get",
    url: "user.json",
    params: {    //get方法帶參數,是放在請求頭中的
    ID: 12345
    },
}).then(resp => {   //resp => {} 相當於 function(resp){}
    console.log(resp); //請求成功
}).catch(error => {
    console.log(error);  //請求失敗
}).then(function(){
    console.log("不管怎么樣都要執行");  //必須執行的代碼,相當於finnally
});

//2、post的請求方法
axios({
    method: "get",
    url: "user.json"
    data:{      //post方法帶的參數,是放在body中的
       firstName: 'Fred',
       lastName: 'Flintstone'
    }
}).then(resp => {     //請求成功
    console.log(resp);
}).catch(error => {    //請求失敗
    console.log(error);
}).then(() => {   //() => {} 相當於 function(){}
    console.log("不管怎么樣都要執行");   //必須執行的代碼,相當於finnally
})

練習實例如下:

<body>
    <div id="box">
        <!--綁定send方法-->
        <button @click="send">發送ajax請求</button>
    </div>

    <script type="text/javascript" src="../vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        new Vue({
            el:"#box",
            methods:{
                send(){
                    axios({
                        method: "get",  //請求方法get
                        url: "user.json"  //在同等目錄下創建一個user.json => {"name":"帥高高","age":23}
                    }).then(resp => {    //請求成功后返回
                        console.log(resp);
                    }).catch(error => {   //請求失敗后的返回
                        console.log(error);
                    }).then(function(){    //相當於finally,一定執行
                        console.log("不管怎么樣都要執行");
                    });
                }
            }
        })
    </script>
</body>

執行結果如下:

2.4、axios.get(url[,options])

傳參方式:1、通過url傳參     2、通過params選項傳參

//1、通過url傳參
axios.get('/user?name=shuaigaogao&age=23').then(response => {
    //請求成功
    console.log(response);
  }).catch(error => {
    // 請求議程
    console.log(error);
  }).then(function () {
    //一定執行的程序,相當於 finnally
  });

//2、通過params選項傳參
axios.get('/user', {
    params: {
      name: shuaigaogao
      age: 23
    }
  }).then(response => {
    //請求成功
    console.log(response);
  }).catch(error => {
    //請求異常
    console.log(error);
  }).then(function () {
    // 一定執行的程序
  });  

練習實例如下: 

<body>
    <div id="box">
        <!--以get方式發送ajax請求-->
        <button @click="sendGet">GET方式發送ajax請求</button>
    </div>

    <script type="text/javascript" src="../vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        new Vue({
            el:"#box",
            methods:{
                sendGet(){ //調用axios.get方式
                    axios.get("user.json").then(resp => { //請求成功   resp => {} 相當於 function(resp){}
                        console.log(resp.data);
                    }).catch(err => { //請求異常
                        console.log(err); 
                    });
                }
            }
        })
    </script>
</body>

結果如下:

>{name: "帥高高", age: 23}
    name: "帥高高"
    age: 23
    >__proto__: Object

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

axios默認發送數據時,數據格式是Request Payload,並非我們常用的Form Data格式,所以參數必須要以鍵值對形式傳遞,不能以json格式傳參。

axios.post("url",{
    username: 'shuaigaogao',  //官方推薦的傳參方式
    age: 23
    }
).then(resp => {
    console.log(resp.data);
}).catch(err => {
    console.log(err);
}).then(function(){
    //一定執行
});

如圖:數據格式是Request Payload

正確的傳參方式:

  •  自己拼接為鍵值對
  • 使用transformRequest,在請求發送前將請求數據進行轉換
  • 如果使用模塊化開發,可以使用qs模塊進行轉化
//自己拼接鍵值對方式
axios.post("url","username=shuaigaogao&age=23" //這個這種方式是放在body中的
).then(resp => {
    console.log(resp.data);
}).catch(err => {
    console.log(err);
}).then(function(){
    //一定執行
});

//使用tansformRequest,在請求發送前請求數據進行轉換
axios.post("url",this.data,{
    transformRequest:{
        function(data){
            let params = '';
            for(let index in data){
                params = index+'='+data[index]+'&';
            }
            return params;
        }
    }
    }
).then(resp => {
    console.log(resp.data);
}).catch(err => {
    console.log(err);
}).then(function(){
    //一定執行
});

我們就拿 tansformRequest,在請求發送前請求數據進行轉換做實例:

<body>
    <div id="box">
        <button @click="sendGet">POST方式發送ajax請求</button>
    </div>

    <script type="text/javascript" src="../vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        new Vue({
            el:"#box",
            data:{
                user:{  //定義操作的數據
                    name:"shuaigaogao",
                    age:23
                }
            },
            methods:{
                sendGet(){
                    axios.post("url",this.user, //this.user就是上面data中的數據
                    {transformRequest:{
                            function(data){   //data就是 this.user傳進來的參數
                                let params = '';
                                for(let index in data){
                                    params = index+'='+data[index]+'&';
                                }
                                return params;  //返回處理好的參數
                            }
                        }
                        }
                    ).then(resp => {
                        console.log(resp.data);
                    }).catch(err => {
                        console.log(err);
                    }).then(function(){
                        //一定執行
                    });
                }
            }
        })
    </script>
</body>

三 、axios不支持跨域操作

axios本身並不支持發送跨域的請求,沒有提供相應的API,作者贊沒有計划在axios添加支持發送跨域請求沒所以只能使用第三方庫。

除非你請求的網站,它本身就支持跨域,比如,github網站,它本身就支持跨域,所以請求它是沒有問題的。

<body>
    <div id="box">
        <!--傳入uid的參數已經綁定到data中的uid中-->
        <button @click="GetUserById(uid)">獲取指定github賬戶信息並顯示</button>
    </div>

    <script type="text/javascript" src="../vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        new Vue({
            el:"#box",
            data:{
                uid:''  //上面綁定GetUserById函數傳入參數uid,已經綁定到data中了
            },
            methods:{
                GetUserById(uid){
                    //在url中調用uid 則用$(uid)
                    axios.get("http://api.github.com/users/$(uid)").then(resp => {
                        console.log(resp.data);
                    })
                }
            }
        })
    </script>
</body>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM