zoukankan      html  css  js  c++  java
  • vue进阶

    vue通过axios实现数据请求

    vue.js默认没有提供ajax功能的。

    所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互。

    注意,axios本质上就是javascript的ajax封装,所以会被同源策略限制。

    1、axios使用方法:

    使用方法一:github下载下来本地引用

    https://github.com/axios/axios/releases

    使用方法二:cdn方式

    https://unpkg.com/axios@0.18.0/dist/axios.js
    https://unpkg.com/axios@0.18.0/dist/axios.min.js

    或者

    https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.js

    https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.min.js

    使用文档:https://www.kancloud.cn/yunye/axios/234845

    axios提供发送http请求的常用方法有两个:axios.get() 和 axios.post() 。

    增 post

    删 delete

    改 put/patch

    查 get

    // 发送get请求
        // 参数1: 必填,字符串,请求的数据接口的url地址,例如请求地址:http://www.baidu.com?id=200
        // 参数2:可选,请求参数和请求头内容,json对象,要提供给数据接口的参数
        axios.get('服务器的资源地址',{ // http://www.baidu.com
            params:{
                参数名:'参数值', // id: 200,
            },
            headers:{
                选项名:'选项值', // 请求头
            }
        
        }).then(response=>{ // 请求成功以后的回调函数
                console.log("请求成功");
                console.log(response.data); // 获取服务端提供的数据,比ajax多一层,获取后端返回数据要response.data
        
        }).catch(error=>{   // 请求失败以后的回调函数
                console.log("请求失败");
                console.log(error.response);  // 获取错误信息
        });
    
        // 发送post请求(默认发的是json格式数据),参数和使用和axios.get()类似。
        // 参数1: 必填,字符串,请求的数据接口的url地址
        // 参数2:必填,json对象,要提供给数据接口的参数,如果没有参数,则必须使用{}
        // 参数3:可选,json对象,请求头信息
        axios.post('服务器的资源地址',{
            username: 'xiaoming',
            password: '123456'
        },{
            headers:{
                选项名:"选项值",
            }
        })
        .then(response=>{ // 请求成功以后的回调函数
          console.log(response);
        })
        .catch(error=>{   // 请求失败以后的回调函数
          console.log(error);
        });

    注意:

    axios.delete()的用法和参数与axios.get()一样

    axios.put()或者axios.patch的用法和参数与axios.post()一样。

    在http协议中,不同的请求动作都有不同的含义,例如:

    get 代表向目标服务器请求获取数据

    post 代表向目标服务器请求上传数据

    put 代表向目标服务器请求更新数据【修改全部数据】

    patch 代表向目标服务器请求更新数据【修改部分数据】

    delete 代表向目标服务器请求删除数据

    使用示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
        <script src="https://unpkg.com/axios@0.18.0/dist/axios.js"></script>
    </head>
    <body>
    <div id="app">
        <input type="text" v-model="city">
        <button @click="get_weather">点击获取天气</button>
    </div>
    <script>
        var vm = new Vue({
            el:"#app",
            data:{
                city:"",
            },
            methods:{
                get_weather(){
                    http://wthrcdn.etouch.cn/weather_mini?city=城市名称
                    axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city)
                    .then(response=>{
                        console.log("http请求成功")
                        console.log(response); // http响应对象
                        console.log(response.data); // 返回的数据
    
                    }).catch(error=>{
                        // 请求失败或者then里面代码出现错误时
                        console.log("http请求失败或者then里面代码报错");
                        console.log(error);
                        console.log(error.response.data); // 如果希望获取来自服务器的错误信息
                    });
                }
            }
        })
    </script>
    </body>
    </html>

    2、json

    json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式。

    json的作用:在不同的系统平台,或不同编程语言之间传递数据。

    2.2、json数据的语法

    json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者json对象。

    // 原生的js的json对象
    var obj = {
      age:10,
      sex: '女',
      work(){                     // work: function(){}的简写
        return "好好学习",
      },
    }

    json数据

    // json数据的对象格式,json数据格式,是没有方法的,只有属性,属性值:字符串,数值(整数,浮点数,布尔值), json,
    {
        "name":"tom",
        "age":18
    }
    
    // json数据的数组格式:
    ["tom",18,"programmer"]

    复杂的json格式数据可以包含对象和数组的写法。

    {
      "name":"小明",
      "age":200,
      "is_delete": false,
      "fav":["code","eat","swim","read"],
      "son":{
        "name":"小小明",
        "age":100,
        "lve":["code","eat"]
      }
    }
    
    // 数组结构也可以作为json传输数据。

    json数据可以保存在.json文件中,一般里面就只有一个json对象。

    总结:

    1. json文件的后缀是.json
    2. json文件一般保存一个单一的json数据
    3. json数据的属性不能是方法或者undefined,属性值只能:数值[整数,小数,布尔值]、字符串、json和数组
    4. json数据只使用双引号、每一个属性成员之间使用逗号隔开,并且最后一个成员没有逗号。
       {
          "name":"小明",
          "age":200,
          "fav":["code","eat","swim","read"],
          "son":{
            "name":"小小明",
            "age":100
          }
        }

    工具:postman可以用于测试开发的数据接口。

    postman就是一个软件,专门提供给开发者组织和测试http请求的。

    2.3、js中提供的json数据转换方法

    javascript提供了一个JSON对象来操作json数据的数据转换.

    方法参数返回值描述
    stringify json对象 字符串 json对象转成字符串
    parse 字符串 json对象 字符串格式的json数据转成json对象

    示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <script>
        // json语法
        let humen = {
            "username":"xiaohui",
            "password":"1234567",
            "age":20
        };
    
        console.log(humen);
        console.log(typeof humen);
    
        // JSON对象提供对json格式数据的转换功能
        // stringify(json对象)  # 用于把json转换成字符串
        let result = JSON.stringify(humen);
        console.log(result);
        console.log(typeof result);
    
        // parse(字符串类型的json数据)  # 用于把字符串转成json对象
        let json_str = '{"password":"1123","age":20,"name":"xiaobai"}';
        console.log(json_str)
        console.log(typeof json_str)
    
        let json_obj = JSON.parse(json_str);
        console.log(json_obj);
        console.log(typeof json_obj)
    
        console.log(json_obj.age)
    </script>
    </body>
    </html>

    3、ajax

    ajax,一般中文称之为:"阿贾克斯",是英文 “Async Javascript And Xml”的简写,译作:异步js和xml数据传输数据。

    ajax的作用: ajax可以让js代替浏览器向后端程序发送http请求,与后端通信,在用户不知道的情况下操作数据和信息,从而实现页面局部刷新数据/无刷新更新数据。

    所以web开发中ajax是很常用的技术,主要用于操作后端提供的数据接口,从而实现网站的前后端分离

    ajax技术的原理是实例化js的XMLHttpRequest对象,使用此对象提供的内置方法就可以与后端进行数据通信。

    实际而言,axios或者jQuery提供的ajax,本质上就是XMLHttpRequest对象操作的封装。

    3.1、数据接口

    数据接口,也叫api接口,表示后端提供操作数据/功能的url地址给客户端使用。

    客户端通过发起请求向服务端提供的url地址申请操作数据【操作一般:增删查改】

    同时在工作中,大部分数据接口都不是手写,而是通过函数库/框架来生成。

    3.2、ajax的使用

    ajax的使用必须与服务端程序配合使用,但是目前我们先学习ajax的使用,所以暂时先不涉及到服务端python代码的编写。因此,我们可以使用别人写好的数据接口进行调用。

    jQuery将ajax封装成了一个函数$.ajax(),我们可以直接用这个函数来执行ajax请求。

    接口地址
    天气接口 http://wthrcdn.etouch.cn/weather_mini?city=城市名称
    音乐接口搜索 http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=歌曲标题
    音乐信息接口 http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.play&songid=音乐ID

    编写代码获取接口提供的数据:

    jQ版本

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/jquery-1.12.4.js"></script>
        <script>
        $(function(){
            $("#btn").on("click",function(){
                $.ajax({
                    // 后端程序的url地址
                    url: 'http://wthrcdn.etouch.cn/weather_mini',
                    // 也可以使用method,提交数据的方式,默认是'GET',常用的还有'POST'
                    type: 'get', 
                    dataType: 'json',  // 返回的数据格式,常用的有是'json','html',"jsonp"
                    data:{ // 设置发送给服务器的数据,如果是get请求,也可以写在url地址的?后面
                        "city":'北京'
                    }
                })
                .done(function(resp) {     // 请求成功以后的操作
                    console.log(resp);
                })
                .fail(function(error) {    // 请求失败以后的操作
                    console.log(error);
                });
            });
        })
        </script>
    </head>
    <body>
    <button id="btn">点击获取数据</button>
    </body>
    </html>

    vue版本:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <script src="js/axios.js"></script>
    </head>
    <body>
        <div id="app">
            <input type="text" v-model="city">
            <button @click="get_weather">点击获取天气</button>
        </div>
        <script>
            let vm = new Vue({
                el:"#app",
                data:{
                    city:"",
                },
                methods:{
                    get_weather(){
                        // http://wthrcdn.etouch.cn/weather_mini?city=城市名称
                        axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city)
                            .then(response=>{
                                console.log(response);
    
                            }).catch(error=>{
                                console.log(error.response)
                        });
                      // 上面的参数写法,也可以是下面这种格式:
                      // axios.get("http://wthrcdn.etouch.cn/weather_mini",{
                      //     // get请求的附带参数
                      //     params:{
                      //         "city":"广州",
                      //     }
                      // }).then(response=>{
                      //     console.log(response.data);  // 获取接口数据
                      // }).catch(error=>{
                      //     console.log(error.response); // 获取错误信息
                      // })
                    }
                }
            })
        </script>
    </body>
    </html>

    4、同源策略

    同源策略,是浏览器为了保护用户信息安全的一种安全机制。所谓的同源就是指代通信的两个地址(例如服务端接口地址与浏览器客户端页面地址)之间比较,是否协议、域名(IP)和端口相同。不同源的客户端脚本[javascript]在没有得到服务端的明确授权的情况下,浏览器会拒绝显示服务端信息提供给前端ajax。

    ajax本质上还是javascript,是运行在浏览器中的脚本语言,所以会被受到浏览器的同源策略所限制。

    前端地址:http://www.oldboy.cn/index.html是否同源原因
    http://www.oldboy.cn/user/login.html 协议、域名、端口相同
    http://www.oldboy.cn/about.html 协议、域名、端口相同
    https://www.oldboy.cn:443/user/login.html 协议不同 ( https和http )
    http:/www.oldboy.cn:5000/user/login.html 端口 不同( 5000和80)
    http://bbs.oldboy.cn/user/login.html 域名不同 ( bbs和www )

    同源策略针对ajax的拦截,代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vue.js"></script>
        <script src="js/axios.js"></script>
    </head>
    <body>
        <div id="app">
            <input type="text" v-model="music"><button @click="get_music">查询歌曲</button>
        </div>
        <script>
            var vm = new Vue({
                el:"#app",
                data:{
                    music:"", // 歌曲标题
                },
                methods:{
                    get_music(){
                        axios.get(`http://tingapi.ting.baidu.com/v1/restserver/ting`,{
                            params:{
                                method:"baidu.ting.search.catalogSug",
                                query:this.music,
                            }
                        }).then(response=>{
                            console.log("查询数据成功!");
                        }).catch(error=>{
                            console.log("查询数据失败!");
                        })
                    }
                }
            })
        </script>
    </body>
    </html>

    上面代码运行错误如下:

    Access to XMLHttpRequest at 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=%E6%88%91%E7%9A%84%E4%B8%AD%E5%9B%BD%E5%BF%83' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    上面错误,关键词:Access-Control-Allow-Origin

    只要出现这个关键词,就是访问受限。出现同源策略的拦截问题。

    4.1、ajax跨域(跨源)方案之CORS

    ajax跨域(跨源)方案:服务端授权[CORS],jsonp,服务端代理

    django使用jsonp方法:

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    from django.http import JsonResponse
    import requests
    
    
    def login(request):
        response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301')  # 通过这个天气的API接口获得天气信息
        # print(response.content) # 字节
        response.encoding = 'utf-8'  # 将其转化为中文字符
        # print(response.text)    # 字符串
        return render(request, 'login.html', {'result': response.text})  # 向前端发送result
    views.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录界面</title>
        <!-- Bootstrap3 核心 CSS 文件 -->
        <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
        <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
        <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
        <!-- Bootstrap3 核心 JavaScript 文件 -->
        <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <!-- font-awesome.min.css图标库4.7版本 -->
        <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
    
    </head>
    <body>
        <h1>后台获取的结果</h1>
        {{ result }}
        <h1>js直接获取结果</h1>
        <input type="button" value="获取数据" onclick="getContent();" />
        <div id="container"></div>
        <script>
            function getContent(){
    
                $.ajax({
                    url: 'http://www.jxntv.cn/data/jmd-jxtv2.html',   //江西电视台的url
                    type: 'POST',                                        //请求方式为POST
                    dataType: 'jsonp',                                  //数据格式为jsonp
                    jsonp: 'callback',
                    jsonpCallback: 'list'                              //表示url的callback等于list,会额外的通过url发过去
                })
            }
    
            function list(arg){
                console.log(arg);
            }
        </script>
    </body>
    </html>
    login.html

    jsonp演示

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <button onclick="getdata()">获取数据</button>
    <script>
        function getdata(){
            // 发送jsonp
            // 1. 创建script标签,并制定src为api地址,并追加到head标签中
            let script = document.createElement("script");
            // callback 就是服务端配合我们返回调用的方法名,把服务端数据作为参数给callback的值对应方法进行调用
            script.src="http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=setdata";
            document.head.append(script);
            console.log(script)
        }
    
        function setdata(data){
            // 这里就是响应数据的处理方法。
            console.log(data);//把数据显示到html页面
        }
    </script>
    </body>
    </html>

    总结:

    0. 同源策略:浏览器的一种保护用户数据的一种安全机制。
       浏览器会限制ajax不能跨源访问其他源的数据地址。
       同源:判断两个通信的地址之间,是否协议,域名[IP],端口一致。
       
       ajax:  http://127.0.0.1/index.html
       api数据接口:  http://localhost/index
       
       这两个是同源么?不是同源的。是否同源的判断依据不会根据电脑来判断,而是通过协议、域名、端口的字符串是否来判断。
       
    1. ajax默认情况下会受到同源策略的影响,一旦受到影响会报错误如下:
         No 'Access-Control-Allow-Origin' header is present on the requested resource
    
    2. 解决ajax只能同源访问数据接口的方式:
       1. CORS,跨域资源共享,在服务端的响应行中设置:
          Access-Control-Allow-Origin: 允许访问的域名地址
       2. jsonp
             所谓的jsonp本质上来说不是ajax技术,jsonp的核心实现是依靠script本身加载外部js文件来实现的。
             当然,实现jsonp技术,也需要服务端的配合
       3. 是否服务端代理
          思路:通过python来请求对应的服务器接口,客户端和python这边处于同源,那么就实现了服务端代理

     

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/baicai37/p/13159241.html
Copyright © 2011-2022 走看看