一、服务器
服务器的本质是一台电脑
作用:
存储一个网站的文件(HTML、CSS、JS、图片、音乐...)
提供网站的文件给用户
如何获得服务器
购买
租赁
资源:
服务器上的网页(HTML文件)、图片、音乐、视频、字体文件、CSS文件、JS文件、等等称之为资源,所以资源代指服务器上存储的内容
网页中的数据,也是服务器对外提供的一种资源
1.1客户端
指Web浏览器
作用:将互联网世界中的Web资源加载、并呈现到浏览器窗口中供用户使用
常见客户端浏览器:
1.2 URL地址(同一资源定位符)
表示服务器上每一个资源的确切位置
服务器上的每个资源,都对应着独一无二的URL地址
数据是服务器上的资源
对数据的操作(增删改查),也对应着不同的URL地址
1.3客户端与服务器通信的过程
分为请求-响应两个步骤,
请求:客户端通过网络去找服务器要资源的过程
响应:服务器把资源通过网络发送给客户端的过程
1.4 Ajax
是浏览器中的技术,用来实现客户端网页请求服务器的数据
二、请求方式
客户端浏览器在请求服务器上的数据时,根据操作性质(增删改查)的不同,可以分为5种常见操作
三、 Ajax基础用法
3.1 axios
专注于数据请求的库
中文官网地址:https//www.axios-http.cn/
英文官网地址:https//www.npmjs.con/package/axi…
语法:
Axios({配置对象}).then(请求成功以后的回调函数)
3.2 基于axios发起get请求
Get请求订单查询参数
如果想指定查询的条件,可以通过params选项来指定查询的参数
3.3基于axios发起post请求
使用axios发起post请求时,只需要将method属性的值设置为‘post’,URL地址改为‘/api/addbool’(具体请求方式和地址参考接口文档,以文档为准)
3.4 get和post方式在发送请求时的差异
1.对于请求行:get有参数需要在url中拼接参数,post不需要
2.对于请求头:get不用设置请求头,post方式要根据传递的参数格式的不同设置不同的请求头
3.对于请求体:get没有体,post方式的参数需要在请求体中传递,注意要配置正确的请求头的设置
四、接口
使用Ajax请求数据时,被请求的URL地址,就叫数据接口(接口或API接口)
每个接口必须有对应的请求方式
4.1接口文档
接口的使用说明书,是调用接口的依据
格式:
五、network工具
开发者工具中的网络面板
可以抓取到所有的网络请求,包括ajax请求
可以使用该工具查看当前ajax请求的详细信息
5.1 network面板介绍
5.2 network面板设常用置
1.隐藏时间轴
2.禁用浏览器缓存
3. 模拟网络
No throttling不限速
Fast 3G 快速3G
Slow 3G 慢速3G
4.显示请求方式
5.3 查看请求状态
200表示成功
pending表示等待(可能网络不好或者断网)
4xx和5xx都表示不同程度的错误
Failed表示失败
5.4查看请求方式和完整地址
5.5查看传输到服务器的数据
5.6查看服务器响应结果
六 form表单
主要负责数据采集功能
组成三部分:表单标签、表单域、表单按钮
6.1表单标签
HTML的
就是表单标签,是一个容器,用来将网页上指定的区域划定为表单区域
6.2表单域
提供采集用户信息的渠道
注:每个表单域必须包含name属性,否则用户填写的信息无法被采集
6.3表单按钮
当表单数据填写完毕后,用户点击表单按钮,会触发表单的提交操作,从而把采集到的数据提交给服务器
注:
1. type= ‘ submit ’表示提交按钮
2. tpye属性的默认值就是submit,因此type= ‘ submit ’可以省略不写
6.3 标签的属性一览表
最重要的3个属性action、method、enctype
enctype属性只能搭配post提交方式使用,如果是get提交,则enctype没有意义
以get方式提交表单数据
在标签上,通过action属性指定提交的URL地址,通过method属性指定提交的方式为get
注:由于method属性的默认值是get,因为method = ‘ get ’可以省略
以post方式提交表单数据
在标签上,通过action属性指定提交的URL地址,通过method属性指定提交的方式为post,并通过enctype属性指定数据的编码方式为application/x-www-form-urlencoded
注:由于enctype的默认值是application/x-www-form-urlencoded,因此enctype可以省略
表单提交的问题:
表单既负责采集数据,又负责把数据提交到服务器,表单的默认提交行为会导致页面的跳转解决方案:
表单只负责采集数据Ajax负责将采集的数据提交到服务器
6.4 jQuery的serialize()函数
能够一次性获取到表单中采集到的数据
语法:
$( ‘ 表单元素的选择器’ ).serialize();
注:在使用serialize()函数快速获取表单数据时,必须为每个表单域添加name属性
该方法是jQuery封装的,使用时必须引入jQuery
使用serialize(),各表单域必须有name属性
使用该方法得到的结果是一个查询字符串结构:name=value&age=value
该方法能够获取隐藏域的值,不能得到禁用状态的值,
不能得到文件域中的文件信息,不能完成文件上传
七、axios请求方法的别名
常用的请求方式:get、post、put、patch、delete
简化别名:
axios.get(url [ , config ])
axios.delete(url [ , config ])
axios.post(url [ , data [ , config ] ])
axios.put(url [ , data [ , config ] ])
axios.putch(url , [ , data [ , config ] ])
axios.get()
axios.post()
八、axios全局配置&拦截器
8.1去哪聚配置请求根路径
在url地址中,协议://域名:端口对应的部分叫做“请求根路径”
好处:提供项目的可维护性,全局配置根路径后,后续的所有请求都可以使用全局配置的根路径
语法:
axios.defaults.baseURL = ‘ 请求根路径 ‘
8.2拦截器
用来全局拦截axios的每一次请求与响应
可以把每个请求中,某些重复性的业务代码封装到拦截器中,提高代码的复用性
九、FormData
是浏览器的对象,用于管理表单数据
作用和jQuery中的serialize()作用一样,用于快速收集表单数据
收集指定表单中拥有name属性的表单元素的value值,生成二进制流数据,这种格式的数据可以直接作为axios请求时的参数
并且可以将创建的FormData对象直接提交给接口
9.1 FormData的API方法
在提交数据前,可以使用下列API方法对数据进行查看和修改
9.2 FromData和serialize的区别
共同点:
1. 都需要设置表单各项的name属性
2. 都能快速收集表单数据
3. 都能够获取到隐藏域( <input type = ‘ hidden /’> )的值
4. 都不能获取禁用状态(disable)的值
不同点:
1. FormData属于原生的代码:serialize是jQuery封装的方法
2. FormData可以收集文件域( <input type = ‘ file ’> )的值,而serialize不能,如果有文件上传,必须要使用FormData
3. 得到的结果的数据类型不一样
十、文件域
10.1文件对象
取得文件对象
10.2本地预览
10.3追加到FormData,实现文件上传
十一、请求报文和响应报文
客户端与服务器通信的过程是基于请求与响应的
请求报文规定了客户端以什么格式把数据发送给服务器
响应报文规定了服务器以什么格式把数据响应给客户端
11.1请求报文
格式:
由请求行、请求头部、空行和请求体4个部分组成
注:
在浏览器中,get请求比较特殊,只有请求头,没有请求体
在浏览器中,post、put、patch、delete请求既有请求头,也有请求体
11.2响应报文
格式:
由状态行、响应头部、空行和响应体4个部分组成
11.3 URL参数
常用的5种请求方式,都可以在URL后面携带请求参数
由于URL的长度有限制,所以请求参数一般都比较小,比如不能做文件上传
常用的请求参数:
/api/xxx?参数=值&参数=值 (这种格式的字符串叫查询字符串,所以这种参数叫查询参数)
/api/xxx值/值 (Restful风格的接口用这种参数)
11.4请求体
除get请求外,其他4种常用请求方式,都可以设置请求体
请求体的大小没有限制,所以可以提交大量的数据
常用的请求体格式:
参数=值&参数=值 (查询字符串格式)
请求头:Content-Type:application/x-ww-form-urlenoded
‘ { “ id “ : 1 , “ name “ : “ gundam “ } ’ (JSON格式)
请求头:Content-Type:application/JSON
New Form() (FormData对象格式)
请求头:Content-Type:mutipart/form-data:xxsd随机字符
11.5 http响应状态码
由三位数字组成,用来标识响应成功与否的状态
作用:客户端浏览器根据响应状态码,即可判断出这次http请求是否成功还是失败
响应状态码和业务状态码
1. 所处位置不同:
在响应头的状态行中所包含的状态码,或者请求列表中的Status,叫做响应状态码
在响应体的数据中所包含的状态码,叫做业务状态码
2. 表示的结果不同
响应状态码只能表示这次请求的成功与否
业务状态码用来表示这次业务处理的成功与否
3. 通用性不同:
响应状态码是由http协议规定的,具有通用性,每个不同的状态码都有其标准的含义,不能乱用
业务状态码是后端程序员自定义的,不具有通用性
十二、XMLHttpRequest(XHR)
是浏览器内置的一个构造函数
作用:基于new处理的XMLHttpRequest实例对象,可以发起ajax请求
axios中的axios.get()、axios.post()、axios()方法,都是基于XMLHttpRequest(XHR)封装出来的
12.1使用XMLHTTPRequest发起get请求
步骤:
1. 创建xhr对象
2. 调用xhr.open()函数
3. 调用xhr.send()函数
4. 监听load事件
12.1.1请求时携带URL参数或提交请求体
URL参数,只能拼接在URL地址后面
请求体,放到send()里面
12.1.2提交请求体数据,需指定Content-Type头
十三、数据交换格式
服务器端与客户端之间数据传输的格式
1. XML(很少用)
2. JSON(主流)
13.1 JSON
是一种数据交换格式,本质上是用字符串的方式来表示对象或数组类型的数据
JSON数据的格式:
1. 对象格式
2. 数组格式
语法要求:
1. 属性名必须使用双引号包裹
2. 字符串类型的值必须使用双引号包裹
3. JSON中不允许使用单引号表示字符串
4. JSON中不能写注释
5. JSON的最外层必须是对象或者数组格式
6. 不能使用undefined或函数作为JSON的值
13.1.1对象格式的JSON数据
最外层使用 { }进行包裹,内部的数据为 ” key ” : “ value ” 的键值对结构
Key必须使用英文的双引号进行包裹
Value的值只能是字符串、数字、布尔值、ull、数组、对象类型
13.1.2数组格式的JSON数据
最外层使用 [ ] 进行包裹,内部的每一项数据之间使用英文的,分隔
每一项的值类型只能是字符串、数字、布尔值、null、数组、对象
13.2序列化和反序列化
序列化:把真实数据转为字符串的过程
反序列化:把字符串转为真实数据的过程
十四、同源策略和跨域
14.1同源
指2个URL地址有相同的协议,主机名,端口号
14.2同源策略
是浏览器提供的一个安全功能
浏览器的同源策略规定:不允许非同源URL之间进行资源交互
14.3跨域
两个URL的协议、主机名、端口号没有完全一致,就是跨域
浏览器允许发起跨域请求,但跨域请求回来的数据,会被浏览器拦截,无法被页面获取到
14.4突破浏览器跨域限制的方案
JSONP和CORS是实现跨域数据请求的两种技术方案
注:JSONP在实际开发中很少会用到,CORS是跨域的主流技术解决方案
CORS用到了XMLHttpRequest对象,发起的是纯正Ajax请求
JSONP方案没有用到XMLHttpRequest对象,JSONP不是真正的AJax技术
只要用到了XMLHttpRequest对象,发起的就是Ajax请求
14.4.1 CORS
是解决跨域数据请求的终极解决方案
CORS技术需要浏览器和服务器同时支持
1. 浏览器要支持CORS功能
2. 服务器要开启CORS功能
原理:
服务器端通过Access-Control-Allow-Origin 响应头,来告诉浏览器当前的API接口是否允许跨域请求
优势:
1. CORS是真正的Ajax请求,支持get、post、delete、put、patch等常见Ajax请求
2. 只需要后端开启CORS功能即可,前端代码无需做任何改动
14.4.2 JSONP
JSONP是实现跨域数据请求的一种技术解决方案,只支持get请求,不支持post、delete等其他请求
在实际开发中很少被使用
1.jsonp的原理本质上利用了Script标签的src属性的天然跨域特性
2.它在向后台接口发起请求的时候,传递一个客户端存在的函数名称,服务器响应该函数的调用形式,并且拼接相应的数据
3.客户端接收服务器的响应数据之后,以js语法进行解析,从而获取后台的数据
4.可以看到,jsonp跨域和异步对象没有任何的关系,并且只能发起get请求
5.它严重的依赖服务器的配合
十五、防抖和节流
15.1防抖
频繁触发某个操作时,只执行最后一次
本质是利用了延时器
let input = document.querySelector('input')
let tid = null
input.addEventListener('input',function(){
clearTimeout(tid)
tid = setTimeout(function(){
axios ({
method:'get',
url:'www.itcbc.com:3006/api/getbook…'
}).then(res => {
console.log(res);
})
},1000)
})
15.2节流
单位时间内,频繁触发同一个操作,只会触发1次
设置一个变量,触发事件时,先做判断,如果是true才继续,是false就不执行
let button = document.querySelector('button')
let falg = true
button.addEventListener('click', function() {
if(!falg){
return
}
falg = false
setTimeout(function(){
console.log(123)
falg =true
},2000)
})