zoukankan      html  css  js  c++  java
  • 2.Web前端之封装自己的AJAX库

    1.AJAX本质

    AJAX是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写,它不是一门新的语言,而是对现有技术的一种综合应用。AJAX本质上是在Http协议的基础上以异步的方式与服务器端进行数据交互。

    2.异步

    异步指的是在某段程序执行的过程中,不会阻塞其他程序的正常执行,这里所说的异步跟java中的多线程有点类似,但是和多线程是有区别的,不要混淆。在JavaScript中通过浏览器内建对象XMLHttpRequest的方式,实现与服务器端进行通信。可以实现对网页的部分刷新。

    3.Http请求与响应

    HTTP请求3个组成部分与XMLHttpRequest方法的对应关系如下:

    1.请求行

    var xhrequest = new XMLHttpRequest();
    xhrequest.open('get','1.php');

    2.请求头

    a.以post方式发送请求

    xhrequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    b.以get方式发送请求(可以不写)

    xhrequest.setRequestHeader('Content-Type', 'text/html');

    3.请求主体

    a.以get方式,此处写null,,但是请求头里面不许填写请求内容,如xhrequest.open('get','1.php?name=rui&age=10');

    xhrequest.send(null);

    b.以post方式

    xhrequest.send('name=rui&age=10');

    4.响应

    HTTP响应是由服务端发出的,HTTP响应3个组成部分与XMLHttpRequest方法或属性的对应关系:

    1、获取状态行(包括状态码&状态信息)

    xhrequest.status //状态码
    xhrequest.statusText //状态信息

    2、获取响应头

    xhrequest.getAllResponseHeaders(); //获取所有响应头信息
    xhrequest.getResponseHeader('Content-Type'); 

    3、响应主体

    xhrequest.responseText; //JSON格式
    xhrequest.responseXML; // XML格式

    由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。JavaScript中onreadystatechange事件用于监听XMLHttpRequest的状态

    4.封装自己的AJAX库

    /**
     * Ajax封装
     * 2016-12-20
     * By Rained
     */
    // 封装自已的Ajax库
    var MyAjax = {
        format: function (params) {
            var data = '';
            // 拼凑参数
            for(key in params) {
                data += key + '=' + params[key] + '&';
            }
    
            // 将最后一个&字符截掉
            return data.slice(0, -1);
        },
        ajax: function (options) {
            // 实例化XMLHttpRequest
            var xhr = new XMLHttpRequest,
                
                // 默认为get方式
                type = options.type || 'get',
                // 默认请求路径
                url = options.url || location.pathname,
                // 格式化数据key1=value1&key2=value2
                data = this.format(options.data);
    
            // get 方式将参数拼接到URL上并将data设置成null
            if(type == 'get') {
                url = url + '?' + data;
                data = null;
            }
    
            xhr.open(type, url);
    
            // post 方式设置请求头
            if(type == 'post') {
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            }
    
            // 发送请求主体
            xhr.send(data);
    
            // 监听响应
            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200) {
                    // 获取响应类型
                    var contentType = xhr.getResponseHeader('Content-Type');
    
                    var data = xhr.responseText;
    
                    // 解析JSON
                    if(contentType.indexOf('json') != -1) {
                        data = JSON.parse(data);
                    }
                    
                    // 调用success
                    options.success(data);
                } else {
                    options.error('请求失败!');
                }
            }
    
        }
    };

    注:GETPOST请求方式的差异

    1GET没有请求主体,使用xhr.send(null)

    2GET可以通过在请求URL上添加请求参数

    3POST可以通过xhr.send('name=itcast&age=10')

    4POST需要设置 

    5GET效率更好(应用多)

    6GET大小限制约4KPOST则没有限制

  • 相关阅读:
    Unity 关于特效和UI显示的优先级问题
    使用Frida神器轻松实现hook C/C++方法
    理解 Android Binder 机制(三):Java层
    理解 Android Binder 机制(二):C++层
    理解 Android Binder 机制(一):驱动篇
    Android Hook Instrumentation
    Cocos Creator 中根据uuid快速定位资源
    android 通用混淆配置
    vToRay + bbr 加速
    SpringBoot项目单元测试
  • 原文地址:https://www.cnblogs.com/rained/p/6201623.html
Copyright © 2011-2022 走看看