Ajax的使用(最详细!!!)

简介: Ajax的使用(最详细!!!)

ajax主要用于无刷新获取数据

优缺点:

优点:无需刷新页面与服务器端实现通信。
允许根据用户事件来更新部分页面内容(局部刷新);
缺点:
没有浏览历史,不可回退                             
存在跨域问题
seo不友好(搜索引擎搜索不到关键字)

1.创建ajax对象

//可以在点击事件里面创建
const xhr=new XMLHttpRequest();

2.发送请求

//请求方法 第一个参数 请求方式第二个是请求路径
//初始化请求
//同源策略可以省略协议和域名,发送时会自动添加上
//xhr.open('GET','/server');
xhr.open('GET','http://127.0.0.1:8000/server');
//发送请求
xhr.send();
//on 当
//readystate是xhr对象的属性,表示状态的意思,有五个值
//change 改变的意思
//0:未初始化 1:open方法调用完毕 2:send方法调用完毕 3:服务端返回了部分的结果 4:服务端返回所有结果
//会触发四次
xhr.onreadystatechange=function(){
//当结果全部返回的时候且状态码为200
if(xhr.readyState===4&&xhr.status===200){
console.log(xhr.status) //状态码
console.log(xhr.statusText)//状态码字符串
console.log(xhr.getAllResponseHeaders()) //所有响应头
console.log(xhr.response) //所有响应体
}
}

3.get请求参数

//?号后面写参数 用&符号分隔 键值对方式
xhr.open('GET','http://127.0.0.1:8000/server?a=100&b=200');
//可以在 query String Parameters 里面做一个请求参数预览

4.post请求发送

//请求方式都为大写
xhr.open('POST','http://127.0.0.1:8000/server');
//send里面不仅仅可以发送请求,还可以携带参数发送
xhr.send('a=100&b=200')

5.设置请求头信息

//一般采用预定义请求头信息,如果需要设置自定义请求头则需要在服务器端开启允许设置自定义请求头
//content-type 是设置请求体内容类型 固定写法
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//自定义请求头信息
//需要在后端开启允许设置自定义请求头
//第一个参数是name 第二个是值
xhr.setRequestHeader('name','1');

6.对返回json参数进行操作

//后端不支持接受对象,所以采用发送字符串的方式
//可以调用json方法
//对返回的参数进行操作
JSON.parse(参数)
//设置对json数据自动转换
设置响应体数据类型
xhr.responseType='json';

BUG ie缓存问题

//问题:ie浏览器,发送请求会存在缓存,下次请求新的数据返回但还是旧的数据
//解决方案:可以在接口请求参数后面添加当前时间戳 Date.now()
xhr.open('POST','http://127.0.0.1:8000/server?t='Date.now);

7.超时与网络异常响应

//用于网络请求超时和网络异常给用户的提醒比较友好
//请求超过2秒就自动取消
xhr.timeout=2000;
//超时回调
xhr.ontimeout=function(){
alert('网络超时')
}
//网络异常操作
xhr.onerror=function(){
alert('网络异常')
}

8.手动取消请求

//取消请求
xhr.abort();

重复发送问题解决

//可以通过标识变量进行判断,发送请求改成false,发送成功在改回true
//也可以通过判断标识是否取消请求

以上是原生发送的请求,下面介绍的是前端常用框架发送请求

第一个框架:jquery 基于回调函数进行发送请求

//第一个是路径 第二个是数据 第三个是回调函数 第四个是设置响应体方法
//get请求 
$.get('http://127.0.0.1:8000/jquery',{a:100},function(res){
console.log(res)
},'json')
//post
$.post('http://127.0.0.1:8000/jquery',{a:100},function(res){
console.log(res)
})
//jquery通用方法 post还可以设置请求体
$.ajax({
//url
url:'http:127.0.0.1/scfe',
//类型
type:'GET',
//请求头信息
headers:{
a:100,b:200
},
//响应体结果类型
dataType:"json",
//数据
data:{},
//成功回调
success:function(){},
//超时时间
timeout:2000,
//失败回调
error:function(){}
})

Axios 库发送ajax请求,是目前最为热门的,是vue和react最为推荐的

基于promise发送请求

可以安装也可以在线链接引用
npm i axios

配置baseURL

axios.defaults.vaseURL='http://127.0.0.1:8000';
//配置过后,axios请求每次都会在前面加上这个,后面直接写接口名称就行

发送请求

//get请求 第一个参数是url 第二个是data
axios.get('/server',{
//url参数
params:{
a:100,b:200
},
//请求头信息
headers:{
name:'100',
age:'200'
}
//.then查看是否发送成功
}).then(res=>{
console.log(res)
})
//post发送请求 第一个路径 第二个请求体 第三个其他选项
axios.post('/server',{user:"112",age:"21"},{
//url参数
params:{
a:100,b:200
},
//请求头信息
headers:{
name:'100',
age:'200'
}
//.then查看是否发送成功
}).then(res=>{
console.log(res)
})
//通用性方法发送请求
axios({
//请求方法
method:"POST",
//url
url:"/sert",
//url参数
params:{
user:'huhu',
age:"dd"
},
//请求头信息
headers:{
a:100,
b:200
},
//请求体信息
data:{
a:1,
b:2
}
}).then(res=>{
console.log(res)
})

ferch()函数发送ajax请求,返回一个promise对象

//第一个参数是url 第二个是配置对象
fetch('http://127.0.0.1:8000/sever',{
//请求方法
method:'POST',
//请求头
headers:{
name:111
},
//请求体
body:'user=1&age=2'
}).then((res)=>{
console.log(res)
//解析成json
res.json()
})

AJAX跨域

跨域首先要了解同源策略

同源策略是浏览器的一种安全策略

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

http协议
www.xxx.com 域名 ip地址不好记,所以都解析成一个域名
8000端口号,一般都是省略的
http://www.baidfcvsad.com:8000
ajax是默认遵循同源策略的,不遵循同源策略,无法直接发送ajax请求
跨域:违背同源策略就是跨域
跨域是经常出现的,因为一台服务器的性能是有限的,所以有需要的时候需要多台服务器去支撑
不是同源策略无法直接发送ajax请求
同源策略可以省略协议和域名,发送时会自动添加上

JSONP解决跨域

ctrl+f5 强制刷新
//JSONP是非官方得跨域解决方案,是程序员发明的一种方法,仅仅支持get请求。
JSONP原理:网页中有一些标签天生具有跨域能力,如:script,link,img,iframe,JSONP是通过script标签的跨域能力来发送请求的。
JSONP的使用:
1.动态创建一个script标签
var script=document.createElement('script');
2.设置script的src,设置回调函数
script.src='http://127.0.0.1:8000/text?callback=abc'
3.将script标签插入到document文档最后
document.body.appendChind(script)

实现原理

//a.js
const data={
name:'王菜菜'
}
console.log(data)
abc(data)
//b.js
<script src='./a.js'></script>
function abc(data){
console.log(data)
}
//这里运行b.js文件能打印出来data,这里的srcipt的scr路径为http协议开头,可以通过创建一个script文件发送请求,实现跨域 
//不过仅仅支持get请求
//这俩个文件是互通的b.js文件的内容,a.js文件也可以访问
//JSONP的数据,是一个函数调用的内容,也就是一段js代码,这样浏览器引擎才能解析和执行该内容
//JSON数据格式可以通过函数携带json格式返回
//app.js
const data={
name:"王菜菜"
}
let str=JSON.stringify(data)
handle(`handle(${str})`)
//index.js
index通过script的src发送get请求,返回数据并接受
function handle(data){
console.log(data)
}
//函数的实参就是返回给客户端的数据,函数必须提前声明

实际实现

//a.js 接口
app.all('/st',(request,res)=>{
const data={
name:'王菜菜'
}
})
let str=JSON.stringify(data);
res.send(`hand(${str})`)
index.js
jsonp首先得定义函数,接受函数,因为jsonp是通过回调函数的方式实现的跨域
function hand(data){
//服务端返回数据
console.log(data)
}
<script src='URL'></script>

jquery发送jsonp请求

//路径后面跟?callback=?是固定写法,必写 第二个参数是服务器返回参数
$.getJSON('URL?callback=?',function(data){
console.log(data)
})
//服务端获取 请求.query.带过来函数名
let cb= request.query.callback;
res.send(`${cb}(${str})`)

CORS跨域

//cors是什么?
CORS是跨域资源共享。CORS是官方解决跨域方案,不需要在客户端作任何特殊操作,完全在服务器中处理,支持get和post,其他请求支持。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
//cors原理
CORS通过响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应就会对响应放行。

CORS实现

//固定写法 返回响应头 *是所以都可访问
response.setHeader('Access-Control-Allow-Origin','*');
//请求头信息自定义
response.setHeader('Access-Control-Allow-Headers','*');
//请求方法自定义
response.setHeader('Access-Control-Allow-Method','*');
//单独设置
response.setHeader('Access-Control-Allow-Origin','http://127.0.0.1:9000');
相关文章
Auto.js VSCode 代码提示怎么生效(代码补全)
Auto.js VSCode 代码提示怎么生效(代码补全)
1045 0
|
存储 JavaScript 前端开发
Javascript-localStorage本地存储
Javascript-localStorage本地存储
364 0
|
SQL 关系型数据库 MySQL
MySQL:CTE 通用表达式
CTE(通用表表达式)为处理复杂查询提供了强大的工具。通过普通CTE,可以简化查询逻辑,提高可读性;通过递归CTE,可以优雅地处理层级结构数据。掌握CTE的使用,对于提升SQL查询能力和优化数据库操作有着重要意义。希望本文能帮助你更好地理解和使用MySQL中的CTE,提高工作效率和代码质量。
731 7
|
监控 定位技术 PHP
使用PHP接入纯真IP库:实现IP地址地理位置查询
本文介绍了如何使用PHP接入纯真IP库(QQWry),实现IP地址的地理位置查询。纯真IP库是一个轻量级的IP数据库,数据格式简单,查询速度快,适合Web应用。首先,下载并放置`QQWry.dat`文件到项目目录。接着,通过编写PHP类解析该文件,实现IP查询功能。最后,提供了一个完整的案例演示,展示如何查询IP地址对应的国家和地区信息。该工具适用于用户地理位置分析、访问日志分析和风控系统等场景,具有轻量级、查询速度快、数据更新方便等优点。
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
1368 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
JSON Java fastjson
老程序员分享:java对象转json
老程序员分享:java对象转json
704 3
|
前端开发
前端:下载文件(多种方法)
前端:下载文件(多种方法)
1735 0
|
机器学习/深度学习 人工智能 自然语言处理
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
|
移动开发 前端开发 安全
Ajax跨域的所有方法(最详细带使用教程!!!)
Ajax跨域的所有方法(最详细带使用教程!!!)
|
存储 移动开发 编解码
Vue3(开发h5适配)
Vue3(开发h5适配)
678 0
Vue3(开发h5适配)