原生AJAX

185 阅读3分钟

原生AJAX

原生Ajax

简介

通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势就是:无刷新获取数据。

Ajax不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式

XML简介

XML是可扩展标记语言,被设计用来传输和储存语言。XML和HTML类似,不同的是HTML中都是预定义标签,而XML中没有与sing一标签,全都是自定义标签,用来表示一些数据。现在已经被json取代了,json更加灵活和便捷。

AJAX的特点

Ajax优点

  1. 可以无需刷新页面而与服务器进行通信
  2. 允许你根据用户事件来更新部分页面内容

AJAX的缺点

  1. 没有浏览历史,不能回退
  2. 存在跨域问题(同源)
  3. SEO(搜索引擎优化)不友好

HTTP协议

http协议(超文本传输协议),协议详细规定了浏览器和万维网服务器之间互相通信的规则

请求报文

重点是格式和参数

//行 第一个是请求类型 第二个是url参数 第三个是HTTP协议的版本 
//头 Host:baidu,com
//  Cookie:name=seven
//  Content-type: application/x-www-form-urlencoded
//空行
//体 请求类型是get,则可以为空  请求类型是post,则请求体 可以不为空

响应报文

状态码:200(ok)404(找不到)403(执行访问被禁止)401(未授权)500(内部错误)

//行 第一个是HTTP版本  第二个是响应状态码 第三个是响应状态字符串
//头 Content-Type:text/html;charset=utf-8
//  Content-length:2048
//  Content-encoding:gzip
//空行
//体  <html>
        <head>
        </head>
        <body>
            <h1>尚硅谷</h1>
        <body>
     </html>

nodeJS安装

安装之后可以进行检验image-20220405200330866

express基本使用

  1. 创建文件夹,在命令窗口中输入npm init --yes(意思是:生成package.json文件)
  2. 再次输入npm i express (意思是:安装express框架)

AJAX案例

ajax的GET请求

服务器端

// 引入express框架
const express=require("express");
// 创建应用对象
const app=express();
// 创建路由
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/server',(request,response)=>{
    // 设置响应头  用来设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    // 设置响应体
    response.send("HELLOajax");
})
// 监听端口启动
app.listen(7000,()=>{
    console.log("服务器启动成功");
})

GET请求

<!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>Document</title>
    <style>
        #box {
            width: 100px;
            height: 100px;
            border: 2px solid green;
        }
    </style>
</head>
<body>
    <button>点击</button>
    <div id="box"></div>
    <script>
        var btn = document.querySelector("button");
        var box = document.querySelector("#box")
        btn.onclick=function(){
            // 创建对象
            const xhr = new XMLHttpRequest();
            // 初始化 设置请求方式和地址
            xhr.open('GET','http://localhost:7000/server?name=sunpengda&age=20')
            // 发送
            xhr.send();
            // 事件绑定  用来处理服务端返回的结果
            // on 当。。。时候
            // readyState  是xhr对象中的属性  表示状态0 1 2 3 4
            // change 改变
            xhr.onreadystatechange=function(){
                // 判断(服务器段返回的结果)
                // 是效率更高
                if(xhr.readyState===4) {
                    // 判断响应的状态码 200 404 403 401 500
                    // 只要是2开头的 就表示成功
                    if(xhr.status>=200&&xhr.status<=300) {
                        // 处理结果  行 头 空行 体
                        // 相应行
                        // console.log(xhr.status);   //状态码
                        // console.log(xhr.statusText);   //状态字符串
                        // console.log(xhr.getAllResponseHeaders);  //所有响应头
                        // console.log(xhr.response);  //响应体
                        // 设置result的文本
                        box.innerHTML=xhr.response;
                    }
                }
            }
​
        }
    </script>
</body>
</html>

Snipaste_2022-04-05_23-42-32.jpg

Ajax的POST请求

服务端

// 引入express框架
const express=require("express");
// 创建应用对象
const app=express();
// 创建路由
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/server',(request,response)=>{
    // 设置响应头  用来设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    // 设置响应体
    response.send("HELLOajax");
})
​
// 接受任意类型的请求
// 接受自定义请求头之结合后的方法成为了OPTIONS
app.all('/server',(request,response)=>{
    // 设置响应头  用来设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    // 接受自定义的头
    response.setHeader('Access-Control-Allow-Headers','*');
    // 设置响应体
    response.send("HELLO AJAX");
})
// 监听端口启动
app.listen(7000,()=>{
    console.log("服务器启动成功");
})

POST请求

<!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>Document</title>
    <style>
        .box {
            width: 100px;
            border: 2px solid green
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        var box=document.querySelector(".box");
        box.addEventListener('mouseover',function(){
            const xhr = new XMLHttpRequest();
            xhr.open('post',"http://localhost:7000/server");
            // 设置响应头
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            // 自定义的响应头
            xhr.setRequestHeader('name',"sunpengda")
            //用来设置请求体
            xhr.send('name=sunpengda&friend=xiaohongtang');
            xhr.onreadystatechange=function(){
                if(xhr.readyState===4) {
                    if(xhr.status>=200&&xhr.status<=300) {
                        box.innerHTML=xhr.response;
                    }
                }
            }
        })
    </script>
</body>
</html>

注意:更改一次服务器(即js文件),就要重启一次服务器

重启方法:快捷键ctrl+`,在终端里面找到js文件所在位置,之后node 文件名.扩展名

image.png