简单请求
我们现在就可以尝试将服务器响应体的内容放置到我们的div中了,以下是详细代码:
<!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: 200px;
border: 1px solid red;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
//获取button原生
const btn = document.querySelector("button");
//获取div标签
const result = document.querySelector("#result");
//绑定事件
btn.onclick = function(){
//1.创建对象,变量名随意
const xhr = new XMLHttpRequest();
//2.初始化,设置请求方法和url
xhr.open('GET','http://127.0.0.1:8000/server');
//3.发送
xhr.send();
//4.事件绑定
//readaystate 是xhr中的属性,表示状态:0 1 2 3 4
//change 当状态改变的时候触发
xhr.onreadystatechange = function(){
//判断,状态为4(服务端返回了所有结果)
if (xhr.readyState == 4){
//判断响应状态码
if (xhr.status >= 200 && xhr.status < 300){
//处理结果 行/头/空行/体
//响应行
// console.log(xhr.status);//状态码
// console.log(xhr.statusText);//状态字符串
// console.log(xhr.getResponseHeader());//所有响应头
// console.log(xhr.response);//响应体
// 设置result的文本
result.innerHTML = xhr.response;
}
}
}
}
</script>
</body>
</html>
服务端代码即为案例准备中的代码,然后打开这个网页,点击按钮,就可以看到服务器返回的结果输出到了div中,并且抓取到了包
注意:如果出现错误,无法发送请求,可以检查是否为以下两种情况:
- 服务器的端口未开启
- server.js中的跨域代码字符串拼写错误
Ajax设置请求参数
GET请求
url参数平时我们使用时,都是在地址栏传参,如下面这样,在?后面加入参数
那么在我们的Ajax中,也是这样,在地址最后输入?,后面接着参数,多个参数之间衔接使用&符,如:
//省略部分代码,原代码与上节课相同
xhr.open('GET','http://127.0.0.1:8000/server/?a=10&b=20&c=30');
打开这个网页,打开抓包工具,就可以看到浏览器捕获到的请求,正好携带我们输入的请求。
POST请求
发送这个请求之前,我们先重新确定一个需求:制作一个div,当我们把鼠标光标放到这个div中时,向服务端发请求,服务器响应之后,将响应体结果打印到div中。
首先我们需要对原服务端的代码进行修改,让服务端支持POST请求,
//1. 引入express
const express = require('express');
//2. 创建应用对象
const app = express();
//3. 创建路由规则,这里设置为post
app.post('/server',(request,response)=>{
//设置响应头 设置允许跨域(第一次接触Ajax,不需要完全理解代码)
response.setHeader('Access-Control-Allow-Origin','*');
//设置响应体
response.send("HELLO AJAX POST");
})
//4. 监听端口,启用服务
app.listen(8000,()=>{
console.log("服务已经启动,8000端口监听中...");
})
然后就可以开始制作我们的html代码了,但是注意这里需要重新启动以下服务端,不然新服务无法应用上去!
<style>
div{
width: 300px;
height: 200px;
border: 1px solid blue;
}
</style>
...
<div></div>
<script>
//获取元素对象
const result = document.querySelector("div");
result.addEventListener('mouseover',function(){
console.log("test");
//1.创建对象
var xhr = new XMLHttpRequest();
//2.初始化
xhr.open('POST','http://127.0.0.1:8000/server');
//3.发送
xhr.send();
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status < 300){
//处理服务器返回的结果
result.innerHTML = xhr.response;
}
}
}
});
</script>
总的来说,和GET请求的操作流程相差不大,之后,我们打开浏览器的抓包工具,可以看到,当鼠标移动到div时返回了响应体结果,并且是POST请求
那么如何给POST请求设置参数呢?
这就需要使用xhr.send()进行发送请求了,如:
//忽略部分代码
xhr.send('a=10&b=20&c=30');
...
打开浏览器抓包工具,看到我们重新捕获到的包,就可以看到我们向服务端请求时携带的参数了。
同时xhr.send()中的内容是可以任意设置的,前提是服务端必须要能识别出你发送的请求,在实际应用中,上例中的请求方式和JSON请求方式是应用比较广泛的
设置请求头信息
在前面的课程中已经可以使用get或者post发送请求行、体,这节课学习请求头信息。
其实实现方法很简单,在xhr.open()方法后面加上xhr.setRequestHeader()方法,这个方法是专门设置头信息的,此方法有两个参数,第一个是头的名字,第二个是头的值。
//2.初始化
xhr.open('POST','http://127.0.0.1:8000/server');
//设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
这里的Content-Type的作用的设置下方请求它内容的类型,固定写法。
回到浏览器,可以看到Request Headers中的Content-Type和我们设置的一样。
那么如果我们想自定义一个头信息可不可以呢,答案是可以的,直接将里面的内容替换成我们需要发送的头信息就好了:xhr.setRequestHeader('name','yuque');
但是如果单单这么做,回到浏览器抓包后,会发现会报错,这是因为前面的是预定义头信息,而现在发送的是自定义头信息,由于浏览器的安全机制,浏览器就会报错。
所以我们还需要对服务器代码进行一些修改,首先要允许所有响应头,其次需要将post请求设置为all
//需要将原来的post请求修改为all,这就意味着不管什么类型的请求都可以响应
app.all('/server',(request,response)=>{
//设置响应头 设置允许跨域(第一次接触Ajax,不需要完全理解代码)
response.setHeader('Access-Control-Allow-Origin','*');
//允许接收所有类型的响应头
response.setHeader('Access-Control-Allow-Headers','*');
//设置响应体
response.send("HELLO AJAX POST")
})
这里需要将post请求设置为all是因为浏览器会发送一个OPTIONS的校验,检测这个头信息可用不可用,这个请求如果没有获得到对应的结果,那么还会报错。
现在我们重启服务端,打开网页,就可以看到效果了
服务端响应JSON数据
在实际应用中,我们向服务端发送一个请求,服务端绝大多数情况下返回的都是JSON格式的数据,我们需要直到这个结果我们应该怎么处理。
我们希望服务端返回的是JSON数据,那么只需要把服务端的send()方法发送一个JSON字符串就好了,如:
app.all('/json-server',(request,response)=>{
response.setHeader('Access-Control-Allow-Origin','*');
response.setHeader('Access-Control-Allow-Headers','*');
const data = {
"name": "yuque"
};
//修改为JSON字符串
let str = JSON.stringify(data);
//设置响应体
response.send(str);
})
然后我们就可以写前端代码了,这节课的需求再次变化一下,当用户按下键盘的时候,发送请求。
...
//省略部分内容
xhr.open('GET','http://127.0.0.1:8000/json-server');
...
xhr.onreadystatechange = function(){
//判断
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status <300){
//将返回的JSON字符串转换为js对象
let data = JSON.parse(xhr.response);
console.log(data);
//将div的内容修改为name
result.innerHTML = data.name;
}
}
}
以上这种方法是服务端返回数据后在进行我们自行进行数据转换,其实还有一种方式,那就是自动转换为JSON对象,我们需要设置xhr的responseType属性。
//创建对象
var xhr = new XMLHttpRequest();
//设置响应数据的类型
xhr.responseType = 'json';
...
xhr.onreadystatechange = function(){
//判断
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status <300){
//此时xhr.response存储的就是js对象了
console.log(xhr.response)
result.innerHTML = xhr.response.name;
}
}
}
来到浏览器,按下键盘,就可以看到结果正如我们所愿。