Per aspera ad astra 循此苦旅,以觅繁星
通过这篇文章带你了解网页与服务器之间的数据交互的原理与使用方法。
在实现数据交互之前先了解服务器的概念,有助于我们之后更好的理解和使用数据交互的语法。
上网的本质目的: 通过互联网的形式来获取和消费资源
客户端:上网过程中,负责获取和消费的电脑,叫做客户端
服务器:上网过程中,负责存放和对外提供资源的电脑,叫做服务器

URL地址:URL(全称是UniformResourceLocator),中文叫 统一资源定位符,用于标识互联网上每个资源的唯一存放位置(类似于身份证号)浏览器只有通过URL地址,才能正确定位资源的存放位置,从而成功访问到对应的资源
步骤:
- 客户端 请求 服务器
- 服务器 处理 这次请求
- 服务器响应客户端

注意
- 客户端与服务器之间的通信过程, 分为 请求 - 处理— 响应 三个步骤
- 网页中的每一个资源,都是通过 请求 - 处理- 响应 的方式从服务器获取回来的
常见资源 :文字内容、image图片、Audio 音频、Video 视频、数据等。
数据也是服务器对外提供的一种资源,必然也要通过 发送 - 请求 - 响应 的方式进行获取
在网页中请求服务器的数据资源,需要用到XMLHttpRequest对象
XMLHttpRequest(简称 xhr)是浏览器提供的js成员,可以通过它请求服务器上的数据资源
简单用法
var xhrObj = new XMLHttpRequest()
客户端请求服务器时,请求的方式很多,最常见的请求方式分别为 get 和 post 请求
通常用于获取服务端资源(向服务器要资源)
例如
根据URL地址,从服务器获取HTML文件,css文件,js文件,图片文件,数据资源等
通常用于向服务器提交数据(往服务器发送资源)
例如
- 登陆时向服务器提交的登录信息
- 注册时向服务器提交的注册信息
- 添加用户时向服务器提交的用户信息等各种数据提交操作
全称 Asynchronous javascript And XML(异步JavaScript 和XML)
通俗的理解: 在网页中来利用XMLHttpRequest对象和服务器进行数据交互的方式,就是 Ajax
Ajax能让我们轻松实现网页于服务器之间的数据交互
- 用户名检测: 注册用户时,通过Ajax的形式,动态检测用户名是否已被占用
- 搜索提示: 打那个输入搜索关键字时,通过Ajax的形式,动态加载搜索提示列表
- 数据分页显示: 当点击页码值的时候,通过Ajax的形式,根据页码值动态刷新表格的数据
- 数据的增删改查: 数据的添加、删除、修改、查询操作,都需要通过ajax的而形式,来实现数据的交互
浏览器中提供的XMLHttpRequest用法比较复杂,jQuery对XMLHttpRequest进行封装,提供了一系列Ajax相关函数,极大的降低了Ajax的使用难度
- $.get() 用来获取是资源
- $.post() 提交资源
- $.ajax() 既可以获取资源,又可以提交资源
专门用来发起get请求,从服务器上的资源请求到客户端来进行使用
语法
$.get(url,[data],[callback]);
- url : string , 必选参数 , 要请求的资源地址
- data: object 可选参数, 请求资源期间要携带的参数
- callback : function 可选参数 请求成功时的回调函数
get()发起不带参数的请求
使用get发起不带参数的请求时,直接提供请求的URL地址和请求成功之后的回调函数即可
$.get('http://www.liulongbin.top:3006/api/getbooks', function (res) {
console.log(res); // 这里的 res 是服务器返回的数据
})
get()发起带参数的请求
$.get('http://www.liulongbin.top:3006/api/getbooks', { id: 1 }, function (res) {
console.log(res);
})
专门用来发起post请求,从而向服务器提交数据
语法
$.post(url,[data],[callback]);
- url : string , 必选参数 ,提交数据的地址
- data: object 可选参数, 要提交的数据
- callback : function 可选参数 数据提交成功时的回调函数
post()向服务器提交数据
$.post('http://www.liulongbin.top:3006/api/addbook',//请求的url地址
{ bookname: '蓝桉跑过少年时', author: '岑桑', publisher: '光明日报出版社' },//提交的数据
function (res) {
console.log(res);
}
)
jQuery中提供的**$.ajax()函数**,是一个功能比较综合的函数,可以请求数据也可以发送数据
语法
$.ajax({
type : ' ', // 请求的方式,例如get、post
url : ' ', //请求的url地址
data ; { }, //这次请求要携带的数据
success : function(res){ } // 请求成功后的回调函数
})
ajax()发起get请求
$.ajax({
type: 'get',
url: 'http://www.liulongbin.top:3006/api/getbooks',
data: { id: 1 },
success: function (res) {
console.log(res);
}
})
ajax()发起post请求
$.ajax({
type: 'post',
url: 'http://www.liulongbin.top:3006/api/addbook',
data: { bookname: '蓝桉跑过少年时', author: '岑桑', publisher: '光明日报出版社' },
success: function (res) {
console.log(res);
}
})
表单在网页中主要负责数据采集功能
form标签用来采集数据,标签的属性用来规定: 如何把采集到的数据发送到服务器
| 属性 | 参数 | 说明 |
|---|---|---|
| action | url地址 | 规定当提交表单时,向何处发送表单数据 |
| method | get或post | 规定以何种方式把表单数据提交到action URL |
| enctype | application/x-www-form-urlenccoded multipart/form-data text/plain | 规定再发送表单数据之前如何让对其进行编码 |
| target | _blank _self _parent _top _framename | 规定在何处打开action URL |
规定当提交表单时,向何处发送表单数据
action属性的值应该是后端提供的一个URL地址,这个URL地址专门负责接受表单提交过来的数据
当< form>表达那在未指定action属性值的情况下,action的默认值为当前页面的URL地址
注意
当表单提交后,页面会立即跳转到action属性指定的URL地址
target属性用来规定在何处打开 action URL
默认情况下,target的值是 _self,表示在相同的框架中打开‘
| 属性 | 说明 |
|---|---|
| _blank | 在新窗口打开 |
| _self | 默认,在相同的窗口中打开 |
| _parent | 在父框架集中打开 |
| _top | 在整个窗口中打开 |
| _framename | 在指定的框架中打开 |
method属性用来规定以何种方式把表单数据提交到action URL
注意
规定在发送表单数据之前如何对数据进行编码
| 属性 | 说明 |
|---|---|
| application/x-www-form-urlenccoded | 在发送前编码所有的字符(默认) |
| multipart/form-data | 不对字符编码,使用包含文件上传间控件的表单时,必须使用该值 |
| text/plain | 空格转换为“ + ” 加号,但不对特殊字符编码 |
注意
表单的同步提交:
通过点击submit按钮,出发表单提交的操作,从而使页面跳转到action URL的行为
同步提交的缺点:
解决方案
表单只负责采集数据,Ajax负责将数据提交到服务器
$("# form").submit(function(e){
alert(‘监听到了表单的提交数据’)
})
$("# form").on('submit',function(e){
alert(‘监听到了表单的提交数据’)
})
调用事件对象 e.prevevtDefault()函数
$(‘选择器’).serialize();
XMLHttpRequest(简称xhr)是浏览器提供的JavaScript对象,通过它,可以请求服务器上的数据资源
var xhr = new XMLHttpRequest()
指定请求方式与url地址:
xhr.open(‘GET’, ‘http://www.liulongbin.top:3006/api/getbooks’)
带参数的
指定请求方式与url地址
xhr.open(‘GET’, ‘http://www.liulongbin.top:3006/api/getbooks?id=1’)
xhr.send(); 发起Ajax请求
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
//监听xhr对象的请求状态readystate;与服务器响应状态status
console.log(xhr.responseText);
}
}
var xhr = new XMLHttpRequest()
指定请求方式与url地址
xhr.open(’POST’, ‘http://www.liulongbin.top:3006/api/addbook’)
xhr.setRequestHeader(‘Content-Type’ , ‘application/x-www-form-urlencoded’)
xhr.send(‘bookname=水浒传&author=施耐庵&publisher=天津出版社’)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
//监听xhr对象的请求状态readystate;与服务器响应状态status
console.log(xhr.responseText);
}
}
- 可以设置HTTP请求的时限
- 可以使用FormData对象管理表单数据
- 可以上传文件
- 可以获取数据传输的进度信息
有时Ajax操作很耗时,而且无法预知要花费多少时间,如果网速很慢,用户可能要等很久
timeout属性 :
- 设置timeout属性:xhr.timeout =3000
- ontimeout事件,用来指定回调函数
xhr.ontimeout = function(event){ alert('请求超时!') } ```
- 1
- 2
var fd = new FormData()
fd.append(‘name’,‘zs’)
var fd = new FormData(form)
(根据form表单创建FormData对象,会自动将表单数据填充到FormData对象中)
- 定义UI结构
- 验证是否选择了文件
- 向FormData中追加文件
- 使用xhr发起上传文件的请求
通过建通xhr.upload.onprogress事件来获取到文件的上传进度
xhr.upload.onprogress=function(e){
if(e.lengthComputable){
var percentComplete = Math.ceil((e.loaded / e.total)*100)
}
}
xhr.upload.onload = function(){
}
jQuery实现文件上传,必须注意以下两个属性:
$.ajax({
method: 'POST',
url: 'http://www.liulongbin.top:3006/api/upload/avatar',
data: fd,
contentType: false,
processData: false,
success: function (res) {
console.log(res);
}
})
Ajax请求开始时,执行ajaxStart函数。可以在ajaxStart的callback中显示loading效果
注意: $(document).ajaxStart()函数会监听当前文档内的所有Ajax请求
Ajax请求结束时,执行ajaxStop函数。可以在ajaxStop函数的callback中隐藏loading效果
axios是专注于网络数据请求的库
axios.get(‘url’, {params: { 参数 }}). then(allback)
axios.post(‘url’,{参数}).then(callback)
axios({
method: '请求类型',
url: 请求的url地址,
data:{ post数据 },
params: { get数据 }
}).then(callback)
注意 : res.data 才是服务器返回的数据
同源
如果两个页面的协议,域名和端口都相同,则两个页面具有相同的源
同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的重要机制
通俗的理解
浏览器规定,A网站的JavaScript,不允许和非同源的网站C之间,进行资源的交互
是指两个URL的协议、域名、端口其中一个或者多个不一致,就是跨域
浏览器的同源策略不允许非同源的URL之间进行资源的交互
JSONP(JSON width Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题
由于浏览器同源策略的限制,网页中无法通过Ajax请求非同源的接口数据。但是< script>标签不受浏览器同源策略的影响,可以通过src属性,请求非同源的js的脚本
通过< script>标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据
由于JSONP是通过< script>标签的src属性,来实现跨域数据获取的,所以JSONP只支持GET数据请求,不支持POST请求
注意
JSONP和Ajax之间没有任何关系,不能把JSONP请求数据的方式叫做Ajax,因为JSONP没有用到XMLHttpRequest这个对象
$.ajax({
url:'http://.....',
dataType: 'jsonp',
success: function(res){
console.log(res)
}
})
默认情况下,使用jQuery发起JSONP请求,会自动携带一个callback=jQueryxxx的参数,jQueryxxx是随机生成的额一个回调函数名称
jsonp:‘callback’
jsonpCallback: ‘abc’
也是通过< script>标签的src属性实现跨域数据访问的,只不过采用的是动态创建和移除< script>标签的方式,来发起JSONP数据请求。
以上就是对Ajax的总结了
🌻Per aspera ad astra 循此苦旅,以觅繁星🌻