2021.7.14 AJAX基础

什么是AJAX?

ajax全名:async javascript and xml
ajax核心作用:实现了数据请求 + 客户端渲染的局部刷新

AJAX核心:基于XMLHttpRequest创建HTTP请求

操作步骤:

  • 创建xhr实例:let xhr = new XMLHttpRequest;

  • 打开一个URL地址(发送请求前的一些配置信息)—— open方法和它常见的一些参数

    • method主要两个请求方式:GET和POST(get/delete/head/options/post/put/patch…)

    • GET和POST请求在官方文档中是没有明确区别的,但是浏览器或者开发的时候,都有一套约定俗成的规范:

      GET请求传递给服务器的信息,除了请求头传递以外,要求基于URL问号传参传递给服务器
      xhr.open(‘GET’, ‘./data.json?lx=1&name=xxx’);

      POST请求要求传递给服务器的信息,是基于请求主体的
      xhr.send(‘lx=1&name=xxx’);

      由于这两个规则导致

      1. GET传递的信息不如POST多,因为URL有长度限制 [IE:2083个字符, chrome:8182个字符],超过这个长度的信息会被自动截掉,这样导致传递内容过多,最后服务器收到的信息是不完整的!
        POST理论上是没有限制的,但是传递的东西越多,速度越慢,可能导致浏览器报传输超时的错误,所以实际上我们会自己手动限制!
      2. GET请求会产生缓存 [浏览器默认产生的,不可控的缓存]:两次及以上,浏览器请求相同的API接口,并且传递的参数也一样,浏览器可能会把第一次请求的信息直接返回,而不是从服务器获取最新的信息!
        在某些需求时,例如实时观测股票动态的网页,需要每隔一分钟刷新一下网页,这时候我们可以通过手动设置GET请求的参数来实现每次可以请求到新的网页xhr.open('GET', './1.json?lx=1&name=xxx&_'+Math.random())
      3. POST相对于GET来讲更安全一些:GET传递的信息是基于URL末尾拼接,这个随便做一些劫持或者修改,就可以直接改了,而POST请求主体信息的劫持不是很好做。但是“互联网面前,人人都在裸奔!”,所以不管什么方式,只要涉及安全的信息,都需要手动加密!![因为默认所有的信息传输都是明文的]!
    • 这两种请求的参数:

      1. url请求地址
      2. async是否采用异步(默认为true)
      3. username
      4. userpass
  • 监听请求的过程,在不同的阶段做不同的处理(包含获取服务器的相应信息) onreadystatechange

    • ajax状态 xhr.readeState
      • 0 UNSENT 未发送
      • 1 OPENED
      • 2 HEADERS_RECEIVED 响应头信息已经返回
      • 3 LOADING 响应主体信息正在处理
      • 4 DONE 响应主体信息已经返回
    • HTTP状态码 xhr.status(状态码)/xhr.statusText(对状态码的描述)
      • 200
      • 206 服务器成功处理了部分GET请求(用于断点续传)
      • 301 永久转移(用于域名迁移)
      • 302 临时转移(用于负载均衡)
      • 304 未修改,当前页面在缓存中,服务器未返回任何资源
      • 305 使用代理
      • 400 请求参数有误
      • 401 没有权限
      • 403 服务器拒绝执行
      • 404 地址错误
      • 408 请求超时
      • 500 未知服务器错误
      • 503 服务器超负荷
      • 505 当前HTTP版本不被支持
      • ……
    • 获取响应主体信息xhr.response/xhr.responseText/xhr.responseXML...
      服务器返回的响应主体的格式
      • 字符串 [一般是JSON字符串] 最常用
      • XML
      • 进制格式数据
      • 文件流格式数据 [buffer/二进制…]
    • 获取响应头信息xhr.getResponseHeader/xhr.getAllResponseHeaders(获取响应头所有信息)
  • 发送请求:send中传递的信息,就是设置请求主体的信息 send方法
    基于请求主体传递给服务器的数据格式是有要求的[Postman接口测试工具]

    1.  form-data 主要应用于文件的上传或者表单数据提交
    
     xhr.setRequestHeader('Content-Type', 'multipart/form-data');   发请求之前要先给请求头加这个
     ---------
     let fd = new FormData;
     fd.append('lx', 0);      如果是文件上传,直接把文件对象添加在某个字段的后面
     fd.append('name', 'xxx');
     xhr.send(fd);
    
    2. x-www-form-urlencoded格式的字符串
       格式:"lx=1&name=xxx"   [常用]
       Qs库:$npm i qs
       Qs.stringify/parse:实现对象和urlencoded格式字符串之间的转换
    
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    ---------
    xhr.send(Qs.stringify({
      lx: 0,
      name: 'xxx'
    }));
    
    3. raw字符串格式
       普通字符串  -> text/plain
       JSON字符串 -> application/json => JSON.stringify/parse  [常用]
       XML格式字符串 -> application/xml
       ......
       
    4. binary进制数据文件  [buffer/二进制...]
       一般也应用于文件上传
       图片 -> image/jpeg
       ...
    5. GraphQL
    
  • xhr有多少个方法?
    + abort 中断请求 触发xhr.onabort事件
    + onerror 信息没有返回[可能是断网了]
    + onload 信息返回,HTTP状态码不一定是200
    + ontimeout 超时 可以通过xhr.ontimeout监听超时时间
    + withCredentials xhr.withCredentials = true 在CORS跨域资源请求中,允许携带资源凭证 例如:cookie
    + xhr.upload.onprogress 监听文件上传的进度
    + …

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值