前端请求方式(包括ajax、axios、跨域问题)

一、前端向后台发送请求有几种方式

1、 script标签的src属性(JSONP,只能发get请求)
2、 iframe(解决jsonp只发get问题,可以发post)
3、 ajax发送请求(asyn javascript and xml)

下面的不看先

4、 link标签的href属性
5、 img标签的src属性
6、 表单提交发送请求
7、 a标签的href发送请求

二、JSONP

摘自:https://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;

2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如

<script><img><iframe>

3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;

4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;

5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

2.1 简单请求的服务器数据

首先回顾一下script标签的作用

	- <script> 元素用于嵌入或引用可执行脚本
	- <script src="url">请求服务器,并返回json "printData(data)"把数据装到data里面去,返回到前端时就会自动调用printData函数(这个在前端自己写)

1、我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的。

远程服务器remoteserver.com根目录下有个remote.js文件代码如下:

alert('我是远程文件');

本地服务器localserver.com下有个jsonp.html页面代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

毫无疑问,页面将会弹出一个提示窗体,显示跨域调用成功。

2.2 函数调用

现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。

jsonp.html页面代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
    var localHandler = function(data){
        alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
    };
    </script>
    <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

remote.js文件代码如下:

localHandler({"result":"我是远程js带来的数据"});

运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。很欣喜,跨域远程获取数据的目的基本实现了。

三、AJAX(重点)

实现Ajax的方式:

3.1 XMLHttpRequest (XHR)

XMLHttpRequest对象是ajax的基础,XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。目前所有浏览器都支持XMLHttpRequest。

<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        //获取button元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById('result');
        //绑定事件
        btn.onclick = function(){
            //1. 创建对象
            const xhr = new XMLHttpRequest();
            //2. 初始化 设置请求方法和url
            xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200');
            //3. 发送
            xhr.send();
            //4. 事件绑定   处理服务端返回的结果
            //readystate 是 xhr 对象中的属性, 表示状态0 1 2 3 4
            xhr.onreadystatechange = function() {
                //判断
                if (xhr.readyState === 4) {
                    //判断响应状态码 200 404 403 401 500
                    //2xx成功
                    if (xhr.status >= 200 && xhr.status <300) {
                        //处理结果  行 头 空行  体
                        //响应
                        // console.log(xhr.status);    //状态码
                        // console.log(xhr.statusText);    //状态字符串
                        // console.log(xhr.getAllResponseHeaders());   //所有响应头
                        // console.log(xhr.response);  //响应体

                        //设置 result 的文本
                        result.innerHTML = xhr.response;
                    }
                }
            }
        }
    </script>
</body>

3.2 jquery

<body>

    <div class="container">
        <h2 class="page-header">jQuery发送ajax请求</h2>
        <button class="btn btn-primary">GET</button>
        <button class="btn btn-danger">POST</button>
        <button class="btn btn-info">通用型方法ajax</button>
    </div>

    <script>

        $('button').eq(0).click(function() {
            //第一个参数是请求url,第二个参数是发送的参数,第三个参数是回调函数,其中的参数是响应体。
            //第四个参数是响应体类型
            $.get('http:127.0.0.1:8000/jquery-server', {a:100,b:200}, function(data){
                console.log(data);
            }, 'json');
        });
        
        $('button').eq(1).click(function() {
            //第一个参数是请求url,第二个参数是发送的参数,第三个参数是回调函数,其中的参数是响应体
            $.post('http:127.0.0.1:8000/jquery-server', {a:100,b:200}, function(data){
                console.log(data);
            });
        });

        $('button').eq(2).click(function() {
            $.ajax({
                //url
                url: 'http:127.0.0.1:8000/jquery-server',
                //参数
                data: {a:100, b:200},
                //请求类型
                type: 'GET',
                //响应体类型
                dataType: 'json',
                //成功的回调
                success: function(data) {
                    console.log(data);
                },
                //超时时间
                timeout: 2000,
                //失败的回调
                error: function() {
                    console.log("出错啦");
                }
            })
        });
    </script> 
</body>

3.3 axios(重点)

看axios之前,先学习一下javaScript异步编程和Promise对象

promise:https://blog.csdn.net/qq_24839991/article/details/79957949

<body>
    <button>GET</button>
    <button>POST</button>
    <button>AJAX</button>
    <script>
        const btns = document.querySelectorAll('button');
        btns[0].onclick = function() {
            //配置baseURL
            axios.defaults.baseURL = 'http:127.0.0.1:8000';
            //GET请求
            axios.get('/axios-server', {
                //url参数
                params: {
                    id: 100,
                    vip: 7
                },
                //请求头信息
                headers: {
                    name: 'atguigu',
                    age: 20
                }
            });
        }
    </script>
</body>

这里看完再看看下面的同源策略

然后再回来看看axios的官方说明

https://www.kancloud.cn/yunye/axios/234845

四、同源安全策略

同源安全策略 默认阻止“跨域”获取资源。但是 CORS 给了web服务器这样的权限,即服务器可以选择,允许跨域请求访问到它们的资源。

实现跨域方式:

  • 1.jsonp

  • 2.空iframe加form

  • 3.CORS,跨域资源共享(Cross-origin resource sharing)

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
    它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

    CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

  • 4.代理

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值