了解Ajax

75 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

AJAX 并不是编程语言,但确是前端学习的重点知识之一,它是一种从网页无刷新访问 Web 服务器的技术。AJAX 代表异步 JavaScript 和 XML。

前后端通信

使用ajax进行通信

ajax的出现,刚好解决了传统方法的缺陷,通过 JavaScript 的异步通信,从服务器获取数据,再更新当前网页的对应部分,而不用刷新整个网页。缺点就是有同源限制。

使用WebSocket进行通信

webSocket协议最大的特点就是解决了http协议只能单方面发送请求的问题,服务端可以主动向客户端推送信息,属于服务器推送技术的一种。有一些特点如下:

  1. 没有同源限制,客户端可以与任意服务器通信
  2. 建立在TCP协议之上,服务端的实现比较容易
  3. 与HTTP协议有着良好的兼容性。默认端口也是80和433,并且握手阶段采用的HTTP协议,因此握手时不容易被屏蔽,能通过各种HTTP代理服务器
  4. 数据格式比较轻量,性能开销小,通信高效
  5. 可以发送文本,也可以发送二进制数据

创建一个Ajax步骤

Ajax的创建总体可以概括为以下几个步骤

  1. 创建异步对象。
  2. 设置请求行。
  3. 设置请求头。
  4. 注册回调函数。
  5. 发送请求主体。

具体如下

  1. 首先是创建一个 XMLHttpRequest 对象。
  2. 然后在这个对象上使用 open 方法创建一个 http 请求,open 方法所需要的参数是请求的方法、请求的地址、是否异步和用户的认证信息。
    xhr.open(method,url,async,username,password)
    method:请求方法,必须参数,值为get或post或head,大小写不敏感。
    url:请求的 URL,必须参数,大部分浏览器仅支持同源请求。
    async:指定请求是否为异步方式,默认为 true。如果为 false,当状态改变时会立即调用
           onreadystatechange 属性指定的回调函数。
    username:可选参数,如果服务器需要验证,该参数指定用户名,如果未指定,当服务器需要
              验证时,会弹出验证窗口。
    password:可选参数,验证信息中的密码部分,如果用户名为空,则该值将被忽略。       
  1. 当 XMLHttpRequest 对象状态变化时会触发onreadystatechange 事件,我们可以通过注册回调函数,来处理请求成功后的结果。当对象的 readyState 变为 4 的时候,代表服务器返回的数据接收完成,这个时候我们可以通过判断请求的状态,如果状态是 2xx 或者 304 的话则代表返回正常。这个时候我们就可以通过 response 中的数据来对页面进行更新了。
  2. 当对象的属性和回调函数注册完成后,最后我们调用 sent 方法来向服务器发起请求,可以传入参数作为发送的数据体。

原生ajax

```
    var xhr = new XMLHttpRequest();
    xhr.open( 'get', 'xxx.php', true );get请求可以省略,post不发送数据也可以省略
    xhr.onreadystatechange = function () {
        if ( xhr.readyState == 4 && xhr.status == 200 ) {
        console.log( '我触发了' );
        console.log( xhr.readyState );
        console.log( xhr.responseText );
        }
    }
    xhr.send( null );
```

readyState状态码说明

  • 0 -代理被创建,但尚未调用 open() 方法。
  • 1 -open() 方法已经被调用。
  • 2 -send() 方法已经被调用,并且头部和状态已经可获得。
  • 3 -下载中, responseText 属性已经包含部分数据。
  • 4 -下载操作已完成。
    0:请求未初始化
    1:服务器已建立连接
    2:请求已接收
    3:请求处理中
    4:请求已完成,且响应已就绪
    

status状态码

同http状态码

get请求传参长度

我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。

而HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是来源于浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,我们必须再次强调下面几点:

    HTTP 协议 未规定 GET 和POST的长度限制
    GET的最大长度显示是因为 浏览器和 web服务器限制了 URL的长度
    不同的浏览器和WEB服务器,限制的最大长度不一样

get和post请求在缓存方面的区别

get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。

post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,不能使用缓存。

因此get请求适合于请求缓存。