【前后端交互】Ajax + HTTP

文章目录

一、Ajax 介绍

(一)客户端与服务器

1、基础定义
  • 客户端:上网过程中,负责获取和消费资源的电脑
  • 服务端:上网过程中,负责存放和对外提供资源的电脑
  • URL
    • 定义:统一资源定位符(Uniform Resoure Locator),是每个网络资源的唯一地址
    • 作用:浏览器只有通过 URL 地址,才能正确定位资源存放位置,从而成功访问对应资源
    • 语法:protocol: // hostname[:port] / path / [;parameters][?query]#fragment
    • 组成
      • 通信协议:客户端与服务器之间的通信协议
      • 域名:存放该资源的服务器 IP 地址名称
      • 资源路径:资源在服务器上的具体存放位置
2、客户端与服务端通信
  • 通信步骤:客户端请求-服务器处理-服务器响应,适用网络所有资源
3、资源请求
  • 资源类型:text、img、audio、video、data
  • 请求工具:XMLHttpRequest 对象,var xhrObj = new XMLHttpRequest()
  • 请求方式
    • get:获取服务端资源
    • post:向服务器提交数据

(二)Ajax

  • Ajax:异步 JavaScript 和 XML(Async Javascript And XML),利用 XMLHttpRequest 对象实现网页和服务器的数据交互
1、jQuery 中的 Ajax
  • 背景:浏览器提供的 XMLHttpRequest 用法复杂,jQuery 封装为简易版本
  • 用法
    • $.get(‘url’ [,{data}] [,callback])
    • $.post(‘url’ [,{data}] [,callback])
    • $.ajax({type/method:‘GET/POST’, url:’ ', data:{请求携带的数据}, success:fn(res)})
2、接口
  • 接口:使用 Ajax 请求数据时,被请求的 URL 地址,就叫数据接口(简称接口),接口具有各自请求方式
  • 接口测试工具
    • 作用:检测接口是否可以正常访问
    • 优点:在不写代码的情况下,对接口进行调用和测试
    • 推荐:PostMan
  • 接口文档
    • 定义:接口的说明文档,是调用接口的依据
    • 组成
      • 接口名称:标识各接口的简单说明
      • 接口 URL:接口调用地址
      • 调用方式:GET / POST
      • 参数格式:接口需要传递的参数,每个参数必须包含参数名称参数类型是否必选参数说明
      • 响应格式:接口返回值的详细描述,一般包含数据名称数据类型说明
      • 返回示例:通过对象形式例举服务器返回数据的结构,可选

二、form 表单

  • 表单:网页中主要负责数据采集功能
  • 组成:表单标签、表单域、表单按钮

(一)<form>标签常用属性

  • <form>标签用于采集数据,<form>标签属性用于规定如何把采集到的数据发送给服务器
属性
描述
actionURL 地址提交表单时的发送地址(未指定时默认当前页面)
methodGTE(提交少量、简单数据)
POST(提交大量、复杂或包含文件上传的数据,更安全)
何种方式将表单提交到 action URL
enctypeapplication/x-www-form-urlencoded(默认,发送器编码所有字符)
multipart/formdata(文件上传时必须使用,不对字符编码)
text/plain
发送表单数据前的编码方式
target_self(默认)
_blank(新窗口打开)
_parent(在父框架集中打开)
_top(在整个窗口打开)
framename(在指定框架打开)
打开 action URL 的位置

(二)阻止表单默认提交

1、同步提交
  • 定义:通过点击 submit 按钮触发表单提交,从而使页面跳转到 action URL 的行为
  • 缺点
    • 页面跳转到 action URL 指向地址,用户体验感差
    • 页面之前的状态和数据丢失
  • 解决方案:表单仅采集数据,Ajax 负责数据提交
2、Ajax 提交
  • 监听事件
    • $(‘form’).submint(function(event){})
    • $(‘form’).on(‘submit’,function(event){})
  • 阻止表单默认提交
    • event.preventDefault()
$("form").submint(function (e) {
  e.preventDefault();
});
$("form").on("submit", function (e) {
  e.preventDefault();
});

(三)快速操作表单数据

1、快速获取表单数据
  • 语法:$(‘form’).serialize()
  • 优点:一次性获取表单所有数据,简化操作
  • 注意:必须为每个表单元素添加 name 属性(不重名)
2、快速清空表单数据
  • 转为原生 DOM 对象 reset()清空
    • $(‘form’)[0].reset()

三、Ajax 进阶

(一)XMLHttpRequest 的基本使用

  • XML:可扩展标记语言(eXtensible Markup Language), 就像 HTML 用来显示数据,XML 用来传输和存储数据,是各应用程序间进行数据传输的最常用工具
  • XMLHttprRequest:简称 xhr,浏览器提供的基于 XML 的 HTTP 请求,用于在后台与服务器交换数据
XMLHttpRequest
jQuery 中的 Ajax
$.get
$.post
$.ajax
1、使用 xhr 发起 GET 请求
  • 创建 xhr 对象
  • 调用 xhr.open() 函数
  • 调用 xhr.send() 函数
  • 监听 xhr.onreadystatechange 事件
// 1、创建 xhr 对象
var xhr = new XMLHttpRequest
// 2、调用 open 函数,指定请求方式和URL地址
xhr.open('GET','url?key1=val1&key2=val2') // 查询字符串:URL 地址后面拼接参数
// 3、调用send函数,发起Ajax请求
xhr.send()
// 4、监听onreadystatechange事件
xhr.onreadystatechange = function(){
  // 4.1、监听xhr对象的请求状态readyState和服务器响应状态status
  if(xhr.readyState === 4 && xhr.status === 200){
    // 4.2、打印服务器响应回来的数据
    console.log(xhr.responseText)
  }
}
(1)readyState 属性
状态
描述
0UNSENTXMLHttpRequest 对象已创建,尚未调用 open 方法
1OPENEDopen() 方法已调用
2HEADERS_RECEIVEDsend() 方法已调用
3LOADING数据接收中,response 属性已包含部分数据
4DONEAjax 请求完成,数据传输已完成失败
(2)查询字符串
  • 定义:URL 地址后面的拼接参数,格式为?key1=val1&key2=val2
  • 本质:无论$.get()$.ajax(),还是xhr 对象发起 GET 请求,携带参数时都将参数以查询字符串的形式追加到 URL 地址后面发送给服务器
(3)URL 编码与解码
  • 编码:URL 地址中只允许出现英文相关字母、标点、数字,如果需要包含中文等字符,需要对中文字符进行编码(转义)
  • 原则:使用安全字符(无特殊用途/意义的可打印字符)表示不安全字符,即使用英文字符表示非英文字符
  • 浏览器提供的 API
    • 编码函数:encodeURL()
    • 解码函数:decodeURL()
  • 注意:浏览器自动对 URL 编码,多数情况下程序员无需关注 URL 地址的编码和解码操作
2、使用 xhr 发起 POST 请求
  • 创建 xhr 对象
  • 调用 xhr.open() 函数
  • 设置 Content-Type 属性(固定写法)
  • 调用 xhr.send() 函数,同时指定要发送的数据
  • 监听 xhr.onreadystatechange 事件
// 1、创建 xhr 对象
var xhr = new XMLHttpRequest
// 2、调用 open 函数,指定请求方式和URL地址
xhr.open('POST','url')
// 3、设置 Content-type 属性(固定写法)
shr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
// 4、调用send函数,同时将数据以查询字符串的形式提交给服务器
xhr.send('key1=val1&key2=val2&...')
// 5、监听onreadystatechange事件
xhr.onreadystatechange = function(){
  // 5.1、监听xhr对象的请求状态readyState和服务器响应状态status
  if(xhr.readyState === 4 && xhr.status === 200){
    // 5.2、打印服务器响应回来的数据
    console.log(xhr.responseText)
  }
}

(二)数据交换格式

  • 定义:服务器客户端进行数据传输与交换的格式
  • 类型:XML 和 JSON
1、XML
  • XML:可扩展标记语言(eXtensible Markup Language), 就像 HTML 用来显示数据,XML 用来传输和存储数据,是各应用程序间进行数据传输的最常用工具
  • 缺点
    • 格式臃肿体积大,传输效率低
    • 在 JS 中解析 XML 较繁琐
      在这里插入图片描述
2、JSON
  • 定义:JS 对象表示法(JavaScript Object Notation),是 JS 对象数据和数组数据的字符串表示
  • 优点:轻量级文本数据交换格式,类似 XML 用于存储和传输数据,但是更小更快更易解析
(1)JSON 结构
  • 对象结构:{"key1":val1, "key2":val2, …}
    • key:必须用英文双引号包裹的字符串
    • val:数据类型仅支持数字、字符串、布尔值、null、数组、对象6种
  • 数组结构:[100, “java”, true, null, {“苹果”}, [90]]
    • val:数据类型仅支持数字、字符串、布尔值、null、数组、对象6种
(2)注意事项
  • 属性名、字符串等必须用双引号包裹
  • JSON 不支持注释/undefined/函数
  • JSON 最外层必须是对象或数组格式
(3)JSON 和 JS 转化
  • 序列化:var json = JSON.stringify(obj)
  • 反序列化:var obj = JSON.parse(json)

(三)封装 Ajax 函数

(四)XMLHttprRequest lv2 新特性

1、XMLHttprRequest
  • 缺点
    • 只支持文本数据传输,无法读取和上传文件
    • 传送和接收数据时,没有进度条,仅提示是否完成
2、XMLHttprRequest lv2
  • 新功能
    • 可以设置 HTTP 请求时限
    • 可以使用 FormData 对象管理表单数据
    • 支持上传文件
    • 可以获得数据传输进度信息
(1)设置 HTTP 请求时限
  • 等待时长:xhr.timeout = n(毫秒)
  • 指定回调:xhr.ontimeout = function(event){}
(2)FormData 对象管理表单数据
  • 定义:HTML5 新增对象,可以模拟表单操作,方便表单处理
  • 提交步骤
    • 新建 FormData 对象
    • 为 FormData 添加表单项
    • 创建 xhr 对象
    • 指定请求类型与 URL 地址
    • 直接提交 FormData 对象,与提交网页表单效果一致
    • onreadystatechange 事件监听
// 1、新建 FormData 对象
var fd = new FormData()
// 2、为 FormData 添加表单项
fd.append('key1','val1')
fd.append('key2','val2')
fd.append('key3','val3')
// 3、创建 xhr 对象
var xhr = new XMLHttpRequest()
// 4、指定请求类型与 URL 地址
xhr.open('POST', 'URL')
// 5、直接提交 FormData 对象,与提交网页表单效果一致
xhr.send(fb)
  • 获取步骤
    • 获取表单元素
    • 监听表单元素的 submit 事件
    • 根据 form 表单创建 FormData 对象,自动将表单数据填充到 FormData
// 1、获取表单元素
var form = document.queryselector('form')
// 2、监听表单元素的 submit 事件
form.addEventListener('submit', function(e){
  // 3、根据 form 表单创建 FormData 对象,自动将表单数据填充到 FormData
  e.preventDefault()
  var fd = new FormData(form)
  var xhr = new XMLHttpRequest()
  xhr.open('POST', 'URL')
  xhr.send(fb)
})
(3)上传文件
  • 定义 UI 结构
  • 验证是否选择文件
  • 向 FormData 追加文件
  • 使用 xhr 发起上传文件请求
(4)数据上传进度
  • xhr.upload.onprogress 事件监听
  • 已传输字节:e.loaded
  • 需传输字节:e.total
  • 百分比进度:Math.ceil((e.loaded / e.total) * 100)
var xhr = new XMLHttpRequest()
xhr.upload.onprogress = function(e){
  if(e.lengthCompuable){
    var percentComplete = Math.ceil((e.loaded / e.total) * 100)
  }
}

(五)jQuery 高级

1、jQuery 实现文件上传
(1)定义 UI 结构
(2)验证是否选择文件
  • 将 jQuery 对象转为 DOM 对象,获取选中的文件列表
  • 判断是否选择文件
$('button').on('click', function(){
  // 将 jQuery 对象转为 DOM 对象,获取选中的文件列表
  var files = $('file')[0].files
  // 判断是否选择文件
  if(files.length <= 0){
    return alert('请选择图片')
  }
})
(3)向 FormData 追加文件
// 向 FormData 追加文件
var fd = new FormData()
fd.append('avatar', files[0])
(4)使用 xhr 发起上传文件请求
$.ajax({
  method:'POST',
  rul:' ',
  data:fd,
  // 不修改 Content-Type 属性,使用 FormData 默认值 
  content-Type: false,
  // 不对 FormData 中的数据进行 url 编码,而是原样发送服务器
  processData: false,
  success:function(res){}
})
2、jQuery 实现 loading 效果
(1)ajaxStart(callback)
  • Ajax 请求开始时执行该函数,callback 中 show() 效果
  • $(document).ajaxStart() 函数监听当前文档内所有 Ajax 请求
(2)ajaxStop(callback)
  • Ajax 请求结束时执行该函数,callback 中 hide() 效果
  • $(document).ajaxStop()

(六)Axios

  • 定义:Axios 是专注于网络数据请求的库
  • 优点
    • 对比 xhr 更简单易用
    • 对比 jQuery 更轻量化
1、axios 发起 GET 请求
  • 语法:axios.get(‘url’, {params: /参数/}).then(callback)
axios.get('url', {params:{key1:val1, key2:val2}}).then(function(res){
  // res.data 是服务器返回数据
  var result = res.data
})
2、axios 发起 POST 请求
  • 语法:axios.get(‘url’, {/参数/}).then(callback)
axios.get('url', {key1:val1, key2:val2}).then(function(res){
  // res.data 是服务器返回数据
  var result = res.data
})
3、axios 直接发起请求
  • 语法:axios({method:‘GET’/‘POST’, url:‘’,
    data:{/* POST数据 /}, params:{/ GET数据 */}}).then(callback)
axios({
  method:'GET', 
  url:'',
  params:{/* GET数据 */}
}).then(function(res){
  var result = res.data
})
axios({
  method:'POST', 
  url:'',
  data:{/* POST数据 */}
}).then(function(res){
  var result = res.data
})

四、跨域与 JSONP

(一)同源策略和跨域

(1)同源
  • 同源:两个 URL 的协议域名端口号相同
  • 同源策略:浏览器提供的一个安全功能,限制非同源 URL 进行资源交互
(2)跨域
  • 跨域:两个 URL 的协议域名端口号存在不同
  • 跨域拦截:浏览器允许发起跨域请求,但是浏览器拦截跨域响应的数据,无法被页面捕获
  • 实现跨域
跨域请求解决方案JSONPCORS
本质临时解决方案跨域 Ajax 请求根本解决方案
优点兼容性好支持 GET 和 POST 请求
缺点仅支持 GET 请求不兼容低版本浏览器

(二)JSONP

  • 定义:JSON 的一种“使用模式”(JSON with Padding),用于解决浏览器跨域访问的问题
1、JSONP 实现原理
  • 实现原理:<script>标签不受浏览器同源策略影响,通过 src 属性请求非同源 JS 脚本,通过函数调用形式接收跨域响应数据
    • 定义回调函数
    • <script>标签的 src 属性请求接口,通过查询字符串形式确定调用函数名称
    • 回调函数获取跨域资源
// 1、定义一个 success 回调函数
<script>
function success(data){
  console.log('JSONP获得data数据')
  console.log(data)
}
</script>
// 2、通过<script>标签,请求接口数据
<script src='url?callback=success&key=val'></script>
2、jQuery 中的 JSONP
  • jQuery 提供的 $.ajax() 函数,不仅支持真正的 Ajax 数据请求,也支持 JSONP 数据请求
(1)携带参数
  • jQuery 发起 JSONP 请求,默认自动携带参数 callback=jQueryxxx(回调函数名称)
    • 自定义参数:jsonp
    • 自定义回调函数名称:jsonpCallback
$.ajax({
  url:'url?key=val',
  // 使用 $.ajax() 发起 JSONP 请求,必须指定 dataType 为 jsonp
  dataType:'jsonp',
  // 发送到服务端的参数名称,默认为 callback
  jsonp:'callback',
  // 自定义回调函数的名称,默认值为 jQueryxxx 格式
  jsonpCallback:'abc',
  success:function(res){}
}) 
(2)jQuery 中 JSONP 实现过程
  • jQuery 采用动态创建和移除<script>标签方式,也通过 src 属性实现 JSONP 跨域数据访问
    • 发起 JSONP 请求:动态向 <header>append 一个<script>标签
    • JSONP 请求成功:动态从 <header>移除刚才 append 的<script>标签

(三)防抖和节流

1、防抖
  • 定义:事件被触发后,延迟 n 秒后再执行回调,n 秒期间事件再次触发则重新计时
  • 优点:有效减少请求次数,节约请求资源
  • 应用:输入框
// 1、定义延时器 ID —— 防抖动的 timer
var timer = null
// 2、定义防抖函数
function debounceSearch(keywords){
  timer = setTimeout(function(){
    // 发起 JSONP 请求
    getSuggestList(keywords)
  }, n000)
}
// 3、触发 keyup 事件时,清空 timer
$('input').on('keyup', function(){
  clearTimeout(timer)
  // 其他代码
  debounceSearch(keywords)
})
  • 全局缓存
    • 定义全局缓存对象
    • 渲染内容时,将用户输入当做键,返回数据作为值进行缓存
    • 触发事件时,先判断缓存中是否有数据
var cacheOby = {}

cacheObj[k] = res

if(cacheObj[keywords]) {
  return renderSuggestList(cacheObj[keywords])
}
2、节流
  • 定义:连续事件在n 秒内仅触发一次
  • 优点:减少触发频率,节约 CPU 资源,提升性能
  • 应用:图片切换、鼠标事件(跟随、滑动)
$function(){
  // 获取图片元素
  var angel = $('img')
  // 监听文档的 mousemove 事件
  $(document).on('mousemove', function(e){
    // 设置图片位置
    $(angel).css('left', e.pageX + 'px').css('right', e.pageY + 'px')
  })
}
  • 节流阀
    • 执行前判断节流阀状态
      • 空:可以执行下次操作
      • 非空:不能执行下次操作
    • 执行后
      • 节流阀重置为空,可以执行下次操作
$function(){
  var angel = $('img')
  // 1、定义节流阀 timer
  var timer = null
  $(document).on('mousemove', function(e){
    // 3、判断节流阀状态
    if(timer) {return}
    timer = setTimeout(function(){
      $(angel).css('left', e.pageX + 'px').css('right', e.pageY + 'px')
      // 2、节流阀重置为空,可以执行下次操作
      timer = null
    },n000)
  })
}

五、HTTP 加强

(一)HTTP 协议

1、通信
  • 定义:信息的传递与交换
  • 三要素:主体、内容、方式
2、通信协议
  • 定义:通信双方采用约定的格式来发送和接收消息
3、HTTP 协议
  • 定义:超文本传输协议(HyperText Transfer Protocol),规定客户端与服务器间进行网页内容传输时遵循的传输格式,简称 HTTP 协议
  • 交互模型:请求/响应交互模型

(二)HTTP 请求消息

1、HTTP 请求消息
  • HTTP 请求:客户端发起的请求
  • HTTP 请求消息:客户端发送到服务端的消息,又叫做 HTTP 请求报文
2、HTTP 请求消息组成
  • 请求行:请求方式、URL、HTTP 协议版本
  • 请求头:描述客户端基本信息,从而提交给服务器(键/值对)
    • User-Agent:浏览器类型
    • Content-Type:发送的数据格式
    • Accept:接收的响应类型
    • Accept-Language:接收语言
  • 空行:请求头后面是空行,表示头部至此结束,分隔请求头与请求体
  • 请求体:存放通过 POST 方式提交到服务器的数据( GET 请求没有请求体)

(三)HTTP 响应消息

1、HTTP 响应消息
  • HTTP 响应消息:服务器响应给客户端的消息内容,又叫做 HTTP 响应报文
2、HTTP 响应消息组成
  • 状态行:HTTP 协议版本、状态码、状态码描述
  • 响应头:描述服务器基本信息,从而响应给客户端(键/值对)
  • 空行:响应头后面是空行,表示头部至此结束,分隔响应头与响应体
  • 响应体:存放服务器响应给客户端的资源内容

(四)HTTP 请求方法

  • 作用:表明对服务器资源执行的操作,最常用的请求方法为 GET 和 POST
序号方法
描述
1GET(查询)发送请求获取服务器资源,数据放在协议头
2POST(新增)向服务器提交资源(如表单/文件),数据存在请求体
3PUT(修改)完整替换更新指定资源数据,没有就新增
4DELETE(删除)删除指定资源的数据
5HEAD类似 GET,但索要的只是响应头,响应体将不会被返回
6OPTION允许客户端查看服务器的支持的http请求方法
7CONNECTHTTP 代理,把服务器作为跳板代替用户去访问服务器专访网页
8TRACE追踪服务器收到的请求,用于测试或诊断
9PATCHPUT 方法的补充,部分更新指定资源的数据

(五)HTTP 响应状态码

  • 定义:表识响应状态
  • 分类
分类
分类描述
1xx信息,服务器收到请求,需要请求者继续执行操作
2xx成功,操作被成功接收并处理
3xx重定向,需要进一步的操作以完成请求
4xx客户端错误,请求包含语法错误或无法完成请求
5xx服务器错误,服务器在处理请求的过程中发生了错误
  • 常见状态码
状态码描述
含义
200OK请求成功,已经正常处理完毕
201Created已创建,成功请求并创建了新资源,通常用于 POST 或 PUT 请求
301Moved Permanently请求永久重定向,转移到其它 URL
302Found请求临时重定向
304Not Modified未修改,请求被重定向到客户端本地缓存
400Bad Request客户端请求存在语法错误
401Unauthorized客户端请求没有经过授权
403Forbidden客户端的请求被服务器拒绝,一般为客户端没有访问权限
404Not Found客户端请求的 URL 在服务端不存在
408Request Timeout请求超时
500Internal Server Error服务端内部错误
501Not Implemented服务器不支持该请求方法
502Service Unavailable服务器超载或系统维护
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值