1、原生Ajax发送请求
Get方法
btn.onclick = function(){ // 创建xhr对象 const xhr = new XMLHttpRequest(); // 发送请求 xhr.open("GET", "http://localhost:5000/server"); xhr.send(); // 监听状态 xhr.onreadystatechange = function(){ // 判断状态, 4表示请求完成,3表示请求处理中,2表示请求已接收,1表示请求已发送 if(xhr.readyState === 4){ // 判断状态码 if (xhr.status >= 200 && xhr.status < 300) { console.log(xhr.responseText); const result = document.getElementById("result"); result.innerHTML = xhr.responseText; } } } }
Post方法
btnpost.onclick = function(){ // 创建xhr对象 const xhr = new XMLHttpRequest(); // 发送请求 xhr.open("POST", "http://localhost:5000/server"); // 设置请求头 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(); // 监听状态 xhr.onreadystatechange = function(){ // 判断状态, 4表示请求完成,3表示请求处理中,2表示请求已接收,1表示请求已发送 if(xhr.readyState === 4){ // 判断状态码 if (xhr.status >= 200 && xhr.status < 300) { console.log(xhr.responseText); const result = document.getElementById("result"); result.innerHTML = xhr.responseText; } } } }
xhr.status
获取状态码 (200表示请求成功, 404表示请求失败, 500表示服务器错误, 304表示请求资源未修改)- 对于post需要添加请求头
- 可以在
send()
中配置传参
2、json类型的响应体数据
服务端
app.post('/server', (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*') const data = { name: 'zhangshang', age: 18 } // json转字符串发送 let str = JSON.stringify(data) res.send(str); })
前端
- 手动转换
let data = JSON.parse(xhr.response)
- 自动转换
// 设置响应体数据类型 xhr.responseType = 'json'
3、请求问题
请求超时设置
// 设置超时时间 xhr.timeout = 2000; // 监听超时,超时后会自动终止请求,并触发ontimeout事件 xhr.ontimeout = function(){ alert("请求超时"); }
取消请求
const btns document.querySelectorAll('button'); let xhr = null; btns[0].onclick function(){ xhr = new XMLHttpRequest(); xhr.open("GET",'http:/127.0.6.1:8888/de1ay'); xhr.send(); } // 取消请求 btns[1].onclick function(){ xhr.abort(); }
4、axios发送请求
GET请求
// 默认基础url axios.defaults.baseURL = 'http://localhost:5000'; // 设置其他配置项 const myconfig = { // url参数 params:{ name:'zhangsan', age:18 }, // 请求头 headers:{ 'Content-Type':'application/json' }, } btn[0].onclick = function () { axios.get('/server',myconfig) .then(res=>{ console.log(res); }).catch(err=>{ console.log(err); }) }
then
后 编写请求成功执行的代码,catch
后编写请求失败执行的代码- 对于配置项,可传可不传
POST请求
post请求和get基本一致,但在传参时有差别
// 默认基础url axios.defaults.baseURL = 'http://localhost:5000'; // 设置其它配置项 const mydata = { // url参数 params:{ name:'zhangsan', age:18 }, // 请求头 headers:{ 'Content-Type':'application/json' }, } const data = { username:username, password:password } btn[0].onclick = function () { axios.get('/server',data,myconfig) .then(res=>{ console.log(res); }).catch(err=>{ console.log(err); }) }
AXIOS请求
axios( { method:'post', url:'/server', // url参数 params:{ name:'zhangsan', age:18 }, // 请求头 headers:{ 'Content-Type':'application/json' }, // 请求体 data:{ name:'zhangsan', age:18000 } } ).then(res=>{ console.log(res); }).catch(err=>{ console.log(err); })
- 在method中设置请求方式,默认请求方式是get
5、解决跨域
- 同源:协议、域名、端口号 必须完全相同。违背同源策略就是跨域
第一种方法:jsonp
使用
script
标签自带跨域能力进行数据传输(服务端将数据包装成js代码发送到用户端)使用
- 动态的创建一个script标签
var elm = document.createElement("script");
- 设置script的src,设置回调函数
elm.src = "http://127.0.0.1:5000/mystyle.js"
- 添加到文档页面
document.body.appendChild(elm);
第二种方法:设置CORS解决跨域
在服务端设置响应头
app.post('/server', (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*') })