ajax学习

Jquery Ajax

这一节学的很晕乎,虽然看完了,但还是很懵,不太清楚如何应用,实际作用

特征:异步、无刷新

(学习dom)

XML简介

XML 可扩展标记语言

XML 被设计用来传输和存储数据

XML和HTML类似,不同的是HTML中都是预定义标签,而XML没有预定义标签,全都是自定义标签,用来表示一些数据。

现在已经被json取代了。

{"name":"孙悟空","age":18,"gender":"男"}

AJAX的特点

AJAX的优点:

(1)可以无需刷新页面与服务器端进行通信

(2)允许你根据用户时间来更新部分页面内容

AJAX的缺点:

(1)没有浏览历史,不能回退

(2)存在跨域问题(同源)

(3)SEO不友好

AJAX的使用

HTTP协议请求报文与响应文本结构

HTTP协议[超文本传输协议],协议详细规定了浏览器和万维网辐鳍鳍之间互相通信的规则。

请求报文

重点格式和参数

、、、

行 POST

头 Host:atguigu.com

​ Cookie:name=guigu

​ Content-type:application/x-www-form-urlencoded

​ User-Agent:chrome 83

空行

体 username = admin&password=admin

、、、

响应报文

、、、

行 HTTP/1.1 200 OK

头 Content-Type:text/html;charset=utf-8

​ Content-length:2048

​ Content-encoding:gzip

空行

			<head>
			    <body>
                    <h1>
                        好好学习
                    </h1>
                </body>
			</head>

AJAX-express框架介绍与基本使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AJAX发送POST请求

鼠标放到方框里面发送post请求,返回结果(响应体结果)在div里面进行一个呈现。

请求体部分格式不固定,都可以写

AJAX设置请求头信息

一般身份校验部分信息可以放在这部分,可以设置请求头信息部分

//2.设置请求头
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Content-Type 设置请求体类型;后面是参数查询字符串内容,固定内容

也可以自定义头信息

            xhr.setRequestHeader('name', 'xiaohei')

存在安全机制就会报错,可以添加一个特殊响应头

//可以接收任意类型的请求all
app.all('/server', (request, response) => {
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    //响应头 增加设置特殊响应头
    response.setHeader('Access-Control-Allow-Headers', '*');
    //设置响应体
    response.send('hello ajax post');
});

服务端响应json数据

手动对数据进行转换

if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        // console.log(xhr.response);
                        // result.innerHTML = xhr.response;
                        //手动对数据进行转换
                        let data = JSON.parse(xhr.response);
                        console.log(data);
                        result.innerHTML = data.name;
                    }
                }

自动对数据进行转换

 //设置响应体数据的类型
            xhr.responseType = 'json';

console.log(xhr.response);
                        result.innerHTML = xhr.response.name;

nodemon自动重启工具

必须提前安装nodejs

终端窗口

安装

PS E:\VS Code\AJAX\原生AJAX> npm install -g nodemon

启动 windows11 前面要加npx

PS E:\VS Code\AJAX\原生AJAX> npx nodemon server.js

AJAX 网络超时和异常

<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');

        btn.addEventListener('click', function () {
            const xhr = new XMLHttpRequest();
            //超时设置 2s 设置
            xhr.timeout = 2000;
            //超时回调
            xhr.ontimeout = function () {
                alert("网络异常,请稍后重试!");
            }
            xhr.onerror = function () {
                alert("你的网络似乎出了一些问题!");
            }
            xhr.open("GET", 'http://127.0.0.1:8000/delay');
            xhr.send();
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>
app.get('/delay', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    setTimeout(() => {
        //设置响应体
        response.send('延时响应');
    }, 3000);
})

取消请求

<body>
    <button>点击发送</button>
    <button>点击取消</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll('button');
        let x = null;
        btns[0].onclick = function () {
            x = new XMLHttpRequest();
            x.open("GET", 'http://127.0.0.1:8000/delay');
            x.send();
        }
        //abort
        btns[1].onclick = function () {
            x.abort();
        }
    </script>
</body>

请求重复发送问题

<body>
    <button>点击发送</button>
    <button>点击取消</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll('button');
        let x = null;
        //标识变量
        let isSending = false;//是否正在发送AJAX请求

        btns[0].onclick = function () {
            //判断标识变量
            if (isSending) x.abort();//如果正在发送,则取消改请求,创建一个新的请求
            x = new XMLHttpRequest();
            //修改标识变量的值
            isSending = true;
            x.open("GET", 'http://127.0.0.1:8000/delay');
            x.send();
            x.onreadystatechange = function () {
                if (x.readyState === 4) {
                    //修改标识符
                    isSending = false;
                }
            }
        }
        //abort
        btns[1].onclick = function () {
            x.abort();
        }
    </script>
</body>

jquery发送ajax

<script>
        $('button').eq(0).click(function () {
            $.get('http://127.0.0.1:8000/jquery-server', { a: 100, b: 200 }, function (data) {
                console.log(data);
            }, 'json')
        })

        $('button').eq(1).click(function () {
            $.post('http://127.0.0.1:8000/jquery-server', { a: 100, b: 200 }, function (data) {
                console.log(data);
            })
        })
    </script>
//jquery服务
app.all('/jquery-server', (request, response) => {
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    // response.send('hello jqery');
    const data = { name: '星期三' };
    response.send(JSON.stringify(data));
})

jQuery发送AJAX请求

 $('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('出错啦!');
                }, //超时,网络异常都会报错,切换到delay,设置延时响应
                //头信息
                headers: {
                    c: 300,
                    d: 400
                }
            })
        })

axios函数发送AJAX请求

<body>
    <button>GET</button>
    <button>POST</button>
    <button>AJAX</button>

    <script>
        const btns = document.querySelectorAll('button');

        //配置url
        axios.defaults.baseURL = 'http://127.0.0.1:8000';

        btns[0].onclick = function () {
            //GET请求
            axios.get('/axios-server', {
                //url参数
                params: {
                    id: 100,
                    vip: 7
                },
                //请求头信息,headers必须小写,不然参数传不进去,name里面参数也必须是英文
                headers: {
                    name: 'Friday', //不能是中文
                    age: 24
                }
            }).then(value => {
                console.log(value);
            });
        }

        btns[1].onclick = function () {
            axios.post('/axios-server', {
                username: 'admin',
                password: 'admin'
            }, {
                //url
                params: {
                    id: 200,
                    vip: 9
                },
                //请求头参数
                headers: {
                    height: 180,
                    weight: 150,
                }
            });
        }
    </script>
</body>

通用方法

btns[2].onclick = function () {
            axios({
                //请求方法
                method: 'POST',
                //url
                url: '/axios-server',
                //url参数
                params: {
                    vip: 10,
                    level: 30
                },
                //头信息
                headers: {
                    a: 100,
                    b: 200
                },
                //请求体参数
                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);
            })

使用fetch函数发送ajax请求

<body>
    <button>AJAX请求</button>
    <script>
        const btn = document.querySelector('button');

        btn.onclick = function () {
            fetch('http://127.0.0.1:8000/fetch-server', {
                //请求方法
                method: 'POST',
                //请求头
                headers: {
                    name: 'Friday'
                },
                //请求体
                body: 'username=admin&password=admin'
            }).then(response => {
                // return response.text();
                return response.json();
            }).then(response => {
                console.log(response);
            });
        }
    </script>
</body>

跨域

同源策略

同源策略最早由Netscape公司提出,是浏览器的一种安全策略。

同源:协议、域名、端口号,必须完全相同

违背同源策略就是跨域

如何解决跨域

JSONP

JSONP是一个非官方的跨域解决方案,只支持get请求。

<body>
    <div id="result"></div>
    <script>
        //处理数据
        function handle(data) {
            //获取result元素
            const result = document.getElementById('result');
            result.innerHTML = data.name;
        }
    </script>
    <!-- <script src="http://127.0.0.1:5500/%E8%B7%A8%E5%9F%9F/JSONP/js/app.js"></script> -->
    <script src="http://127.0.0.1:8000/jsonp-server"></script>
</body>
//JSONP服务
app.all('/jsonp-server', (request, response) => {
    // response.send('console.log("hello jsonp")');
    const data = {
        name: '星期五'
    };
    //将数据转化为字符串
    let str = JSON.stringify(data);
    //返回结果
    response.end(`handle(${str})`);//返回的是一个函数形式,但是函数的实参就是想给客户端返回的结果数据
});
原生jsonp实践
<body>
    用户名:<input type="text" id="username">
    <p></p>
    <script>
        //获取input元素
        const input = document.querySelector('input');
        const p = document.querySelector('p');

        //申明handle函数
        function handle(data) {
            input.style.border = 'solid 1px red';
            //修改p标签的提示文本
            p.innerHTML = data.msg;
        }

        //绑定事件
        input.onblur = function () {
            //获取用户的输入值
            let username = this.value;
            //向服务端发送请求,检测用户名是否存在
            //1.创建一个script标签
            const script = document.createElement('script');
            //2.设置标签的src属性
            script.src = 'http://127.0.0.1:8000/check-username';
            //3.将script插入到文档中
            document.body.appendChild(script);
        }
    </script>
</body>
//用户名检测是否存在
app.all('/check-username', (request, response) => {
    // response.send('console.log("hello jsonp")');
    const data = {
        exist: 1,
        msg: '用户名已经存在'
    };
    //将数据转化为字符串
    let str = JSON.stringify(data);
    //返回结果
    response.end(`handle(${str})`);//返回的是一个函数形式,但是函数的实参就是想给客户端返回的结果数据
});

CORS

CORS(cross-origin resource sharing),跨域资源共享。他的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和post请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器生命哪些源站通过浏览器权限访问哪些资源。

CORS是通过设置一个响应头告诉浏览器。该请求允许跨域,浏览器收到该响应以后就会对响应放行。

<body>
    <button>发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.querySelector('button');
        btn.onclick = function () {
            //1.创建对象
            const x = new XMLHttpRequest();
            //2.初始化设置
            x.open("GET", "http://127.0.0.1:8000/cors-server");
            //3.发送
            x.send();
            //4.绑定事件
            x.onreadystatechange = function () {
                if (x.readyState === 4) {
                    if (x.status >= 200 && x.status < 300) {
                        //输出响应体
                        console.log(x.response);
                    }
                }
            }
        }
    </script>
</body>
//cros
app.all('/cors-server', (request, response) => {
    //设置响应头
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Access-Control-Allow-Methods", "*");
    response.send('hello CROS');
});

简单介绍

1.1 $ajax

jquery调用ajax方法:

格式: $.ajax({});

参数:

type:请求方式GRT/POST(需要服务器的支持)

url:请求地址url

async:是否异步,默认true表示异步

data:发送到服务器的数据

dataType:预期服务器返回的数据类型

contentType:设置请求头

success:请求成功时调用函数

error:请求失败调用函数

}
        }
    }
</script>
```
//cros
app.all('/cors-server', (request, response) => {
    //设置响应头
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Access-Control-Allow-Methods", "*");
    response.send('hello CROS');
});

简单介绍

1.1 $ajax

jquery调用ajax方法:

格式: $.ajax({});

参数:

type:请求方式GRT/POST(需要服务器的支持)

url:请求地址url

async:是否异步,默认true表示异步

data:发送到服务器的数据

dataType:预期服务器返回的数据类型

contentType:设置请求头

success:请求成功时调用函数

error:请求失败调用函数

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值