AJAX案例

同源策略: 协议,域名,端口号必须完全相同。
违背同源策略就是跨域

GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

案例代码:

AJAX JS代码

//1. 引入express
const express = require('express');


//2.创建应用对象
const app = express();

//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
//这里为get方法
app.get('/home1', (request, response) => {
    //设置响应头 设置允许跨域
    //*表示接受所有域名,*号可换成指定地址,仅该地址能访问服务端
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    //设置响应体
    response.send('HELLO AJAX1');
    //     //响应一个数据
    //     var data = {
    //         name: 'hhh'
    //     };
    //     //对对象进行字符串转换
    //     var str = JSON.stringify(data);
    //     //设置响应体
    //     response.send(str);


});

//post方法
app.post('/home2', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    //设置响应体
    response.send('HELLO AJAX2');


});

//all方法:可以接受任意类型的请求
app.all('/home3', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    //响应一个数据
    var data = {
        name: 'HELLO AJAX3'
    };
    //对对象进行字符串转换
    var str = JSON.stringify(data);
    //设置响应体
    response.send(str);
});

//延时响应
app.all('/time', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    setTimeout(() => {
        //设置响应体
        //json类型数据
        var data = { name: '爹' };
        response.send(JSON.stringify(data));
        // response.send('HELLO AJAX4');
    }, 2000); //2秒延迟

    //     //响应一个数据
    //     var data = {
    //         name: 'hhh'
    //     };
    //     //对对象进行字符串转换
    //     var str = JSON.stringify(data);
    //     //设置响应体
    //     response.send(str);


});

//jQuery服务
app.all('/jquery-server', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    // response.send('Hello jQuery AJAX');
    //json数据
    var data = { name: '爹' };
    response.send(JSON.stringify(data));

});

//axios服务
app.all('/axios-server', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    // response.send('Hello jQuery AJAX');
    //json数据
    var data = { name: '爹' };
    response.send(JSON.stringify(data));

});

//fetch服务
app.all('/fetch-server', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader("Access-Control-Allow-Origin", "*");
    //允许自定义响应头 *表示所有类型的请求头都可以接受
    response.setHeader('Access-Control-Allow-Headers', '*');
    // response.send('Hello jQuery AJAX');
    //json数据
    var data = { name: '爹' };
    response.send(JSON.stringify(data));

});

// jsonp服务
app.all('/jsonp', (request, response) => {
    //使用jsonp跨域,服务端返回的响应体应为js代码
    // 由进行请求的script标签进行编译
    // response.send('console.log("Hello jsonp")');
    var data = {
            name: '爹'
        }
        //将数据转化为字符串
    var str = JSON.stringify(data);
    //返回结果 形式为函数调用
    // 函数要提前声明,函数参数为想要返回的数据
    response.end(`fn(${str})`);
});

// jQuery-jsonp服务
app.all('/jsonp2', (request, response) => {
    var data = {
        name: '爹',
        age: 66
    };

    //将数据转化为字符串
    var str = JSON.stringify(data);
    // 接收callback参数
    var cb = request.query.callback;

    //返回结果 形式为函数调用
    // 函数要提前声明,函数参数为想要返回的数据
    response.end(`${cb}(${str})`);
});

// });
//4.监听端口启动服务 1000为自定义端口
app.listen(1000, () => {
    console.log("服务已经启动,1000端口监听中...");
})

1.标准方法 发送AJAX请求:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>标准方法 发送 AJAX请求</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #90b;
        }
    </style>
</head>

<body>
    <button>点击发送请求</button>
    <button>点击取消请求</button>
    <div id="result"></div>
    <script>
        //获取button元素
        var btn = document.getElementsByTagName('button');
        var result = document.querySelector('#result');
        //将xhr变量写到外部便于两个按钮都能用
        var xhr = null;
        //标识变量,解决重复请求问题
        var isSending = false; //是否正在发送请求 false未,true正在
        //绑定事件
        btn[0].onclick = function() {
                //判断标识变量
                if (isSending) {
                    //如果上个请求正在发送,则取消上个请求
                    xhr.abort()
                };

                //AJAX操作
                //1.创建对象
                xhr = new XMLHttpRequest(); //xhr为自定义名
                //修改 标识变量
                isSending = true;

                //设置响应体数据类型 自动将服务端数据转换成json数据
                // xhr.responseType = 'json';

                //超时设置 2s设置
                // xhr.timeout = 2000;
                //超时回调
                // xhr.ontimeout = function() {
                //     alert('请求超时!');
                // };
                //网络异常回调
                xhr.onerror = function() {
                    //网络未连接时提醒
                    alert('您的网络异常!');
                };

                //2.初始化 设置请求的方法(这里方法为GET)和url
                xhr.open("GET", "http://127.0.0.1:1000/home1");

                //用下条代码解决ie浏览器缓存问题
                // xhr.open("GET", 'http://127.0.0.1:1000/home?t='+Date.now());

                //post方法如下
                // xhr.open("POST", "http://127.0.0.1:1000/home");

                //url后可以加GET请求参数 如下
                // xhr.open("GET", "http://127.0.0.1:1000/home?a=100&b=200");

                //设置请求头
                // xhr.setRequestHeader('头的名字', '值');

                //3.发送
                xhr.send();
                //请求体可以发送post请求参数
                // xhr.send('a=100&b=200&...');
                // xhr.send('a:100&b:200&...');
                // xhr.send('123');

                //4.事件绑定 处理服务端返回的结果
                xhr.onreadystatechange = function() {

                    //判断 (服务端返回了所有的结果)
                    if (xhr.readyState === 4) {
                        //修改标识变量
                        isSending = false;
                        //判断响应状态码  200 404 403 401 500
                        if (xhr.status >= 200 && xhr.status < 300) {

                            //处理结果 行 头 空行 体
                            // console.log(xhr.status); //状态码
                            // console.log(xhr.statusText); //状态字符串
                            // console.log(xhr.getAllResponseHeaders); //所有响应头
                            // console.log(xhr.response); //响应体

                            //手动对数据转化
                            // var data=JSON.parse(xhr.response);
                            // result.innerHTML=data.name;  

                            //设置result文本
                            result.innerHTML = xhr.response;

                        } else {

                        }
                    }
                }

            }
            //abort方法,取消请求
        btn[1].onclick = function() {
            xhr.abort();
        }
    </script>
</body>

</html>

2.jquery 发送 AJAX请求

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jquery 发送 AJAX请求</title>
    <!-- 引入cdn 远程jQuery -->
    <!-- crossorigin="anonymous"为跨源请求的属性设置 -->

    <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

    <style>

    </style>
</head>

<body>
    <button>点击发送请求1</button>
    <button>点击发送请求2</button>

    <script>
        //get,post发送请求
        $('button').eq(0).click(function() {
                //发送get请求  发送post请求只需把get改为post
                //第一个参数给谁发
                //第二个参数为发送的参数,对象格式
                //第三个参数是一个回调,回调函数中的参数为响应体
                //第四个参数为响应体类型
                $.get('http://127.0.0.1:1000/jquery-server', {
                    a: 100,
                    b: 200
                }, function(date) {
                    console.log(date);
                }, 'json');
            })
            //jQuery通用方法,Ajax方法发送请求
        $('button').eq(1).click(function() {
            $.ajax({
                //url
                url: 'http://127.0.0.1:1000/time',
                //参数 对象格式
                data: {
                    a: 100,
                    b: 200
                },
                //请求类型
                type: 'GET',
                //响应体结果类型
                dataType: 'json',
                //成功的回调
                success: function(data) {
                    console.log(data);

                },
                //超时时间
                timeout: 5000,
                //失败的回调
                error: function() {
                    console.log('出错了!');
                },
                //头信息 自定义的头信息
                headers: {
                    c: 300,
                    d: 400
                }

            })
        })
    </script>
</body>

</html>

3.axios 发送 AJAX请求

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>axios 发送 AJAX请求</title>
    <!-- 引入axios -->
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
</head>

<body>
    <button>GET点击发送1</button>
    <button>post点击发送2</button>
    <button>AJAX通用点击发送3</button>
    <script>
        var btns = document.querySelectorAll('button');
        //配置baseURL
        axios.defaults.baseURL = 'http://127.0.0.1:1000';
        btns[0].onclick = function() {
            //GET 请求
            axios.get('/axios-server', {
                //url参数
                params: {
                    id: 100,
                    vip: 1
                },
                //请求头信息
                headers: {
                    name: 'die',
                    age: 18
                }
            }).then(value => {
                console.log(value);
            })
        };
        btns[1].onclick = function() {
            //post 请求
            //第二个参数为请求体信息,第三个参数才是其它配置
            axios.post('/axios-server', {
                username: 'admin',
                password: 'admin'
            }, {
                //url参数
                params: {
                    id: 100,
                    vip: 1
                },
                //请求头信息
                headers: {
                    height: 180,
                    weight: 200,
                },

            }).then(value => {
                console.log(value);
            })
        };
        btns[2].onclick = function() {
            axios({
                //请求方法
                method: 'POST',
                //url
                url: '/axios-server',
                // url参数
                params: {
                    a: 10,
                    b: 20
                },
                //头信息
                headers: {
                    c: 200,
                    b: 3000
                },
                //请求体参数
                data: {
                    username: 'admin',
                    password: 'admin'
                }
            }).then(response => {
                //全部信息
                console.log(response);
                //响应状态码
                console.log(response.status);
                // 响应状态字符串
                console.log(response.statusText);
                // 响应头信息
                console.log(response.headers);
                // 响应体
                console.log(response.data);
            })
        }
    </script>

</body>

</html>

4.fetch 发送 AJAX请求

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>fetch 发送 AJAX请求</title>
</head>

<body>
    <button>请求</button>
    <script>
        var btn = document.querySelector('button');
        btn.onclick = function() {
            // ?c=10 ?后为参数
            fetch('http://127.0.0.1:1000/fetch-server?c=10', {
                //请求方法
                method: 'POST',
                // 请求头
                headers: {
                    name: '666'
                },
                // 请求体
                body: 'a=100&b=200'
            }).then(response => {
                // json为fetch中的一个方法,可以获得json数据
                return response.json();
            }).then(response => {
                console.log(response);
            })
        }
    </script>
</body>

</html>

5.jsonp跨域

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jsonp跨域</title>
    <style>
        #thisdiv {
            height: 200px;
            width: 200px;
            border: solid 2px #90b;
        }
    </style>
</head>

<body>
    <div id="thisdiv"></div>
    <script>
        //处理数据
        function fn(data) {
            var div = document.querySelector('#thisdiv');
            div.innerHTML = data.name;
        }
        // 用script标签进行跨域时在script标签内时这样写
        // 1.创建script标签
        // var script = document.createElement('script');
        // 2.设置script标签src
        // script.src = 'http://127.0.0.1:1000/jsonp';
        // 3.将script标签插入文档中
        // document.body.appendChild(script);
    </script>
    <!-- 用script标签进行跨域时在script标签外时这样写 -->
    <script src="http://127.0.0.1:1000/jsonp"></script>



</body>

</html>

6.jQuery-jsonp

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jQuery-jsonp</title>
    <style>
        #dddd {
            width: 200px;
            height: 200px;
            border: solid 3px #90c;
        }
    </style>
    <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>

<body>
    <button>点击发送jsonp请求</button>
    <div id="dddd"></div>
    <script>
        $('button').eq(0).click(function() {
            // callback=?参数为固定形式
            $.getJSON('http://127.0.0.1:1000/jsonp2?callback=?', function(data) {
                $('#dddd').html(`
                    名称:${data.name},
                    年龄:${data.age}
                `)
            });
        });
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Baker-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值