zoukankan      html  css  js  c++  java
  • 前后端交互模式

    一、原生Ajax

    1.1ajax概述

    Ajax 即“Asynchronous Javascript And XML”(异步 JavaScriptXML),是一种用于客户端与服务端进行数据交互的一种技术。

    Ajax 能够创建交互式、快速动态网页应用,无需重新加载整个网页的情况下,能够更新部分网页。

    Ajax 可以使网页实现异步更新,在不重新加载整个网页的情况下,对网页的某部分进行更新。

    Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。

    1.2Ajax使用

    传统的前后端异步数据交互,使用原生的JavaScript创建一个XMLHttpRequest实例对象来实现。

    new XMLHttpRequest();
    

    1.2.1主要方法

    • open(method, url, asycn)
    1. method: 请求的类型;GET 或 POST。
    2. url: 统一资源定位符(定位文件在服务器上的位置)。
    3. `asycn: 是否异步;true 或 false。
    • send(String)
    • **String**: 发送到服务器的数据(仅用于POST请求)

    1.2.2请求方式

    • GET

    优点:与POST相比,GET轻巧快捷,并且在大部分情况下都能用。

    缺点:

    无法使用缓存文件(更新服务器上的文件或数据库);
    无法向服务器发送大量数据(POST没有数据量限制);
    发送包含未知字符的用户输入时,参数暴露在地址栏。

    • POST

    优点:

    能够携带的数据大小没有限制;
    隐藏请求的参数、数据体,相比GET更加安全,更稳定可靠;
    能够发送文件流。

    缺点:由于大多数情况下发送的数据量较大,响应时间会比GET稍慢。

    1.3实例

    创建XMLHttpRequest()实例

    let xhr = new XMLHttpRequest();
    

    1.3.1请求

    1. GET请求
    • 无参请求
    xhr.open("GET","index.html",true);
    xhr.send();
    
    • 带参请求
    xhr.open("GET","user?method=view&id=1",true);
    xhr.send();
    
    1. POST请求
    • 无参请求
    xhr.open("POST","index.html",true);
    xhr.send();
    
    • 带参请求
    xhr.open("POST","user",true);
    xhr.send("method=delete&id=1");
    

    1.3.2响应

    响应主体分为xhr.responseTextxhr.responseXML两类。

    • 当响应数据为XML时:
    let xml_doc = xhr.responseXML;
    
    • 当相应数据为Text时:
    let text_doc = xhr.responseText;
    

    1.4XHR属性与XHR方法

    XMLHttpRequest简称:XHR

    1.4.1XHR属性

    # 属性名 描述
    1 readyState 存储函数(或函数名),每当readyState的属性改变时,就会调用该函数。
    2 readyState 存有的XMLHttpRequest的状态从0到4发生变化。0:请求未初始化;1:服务器连接已建立;2:请求已接收;3:请求处理中;4:请求已完成,且响应已就绪
    3 reponseText 以文本形式返回响应。
    4 responseXML 以XML格式返回响应
    5 status 将状态返回为数字(例如,“Not Found”为404,“OK”为200)
    6 statusText 以字符串形式返回状态(例如,“Not Found”或“OK”)

    1.4.2XHR方法

    # 属性名 描述
    1 abort() 取消当前请求。
    2 getAllResponseHeaders() 以字符串形式返回完整的HTTP标头集。
    3 getResponseHeader( headerName ) 返回指定HTTP标头的值。
    4 void open(method,URL) 打开指定获取或交的方法和URL的请求。
    5 void open(method,URL,async) 与上面相同,但指定异步或同步。
    6 void open(method,URL,async,userName,password) 与上面相同,但指定用户名和密码。
    7 void send(content) 发送获取请求。
    8 setRequestHeader( label,value) 将标签/值对添加到要发送的HTTP标头。


    二、jQuery封装的Ajax API

    jQuery 提供多个与 AJAX 有关的方法。它将原生的Ajax进行了封装,提高了它的易用性。

    ajax() 方法通过 HTTP 请求加载远程数据。

    2.1Ajax()方法

    jQuery.ajax(url,[settings])

    该方法能够向服务器发送任意请求方式,配置一系列参数(如请求头、响应头、请求类型,响应类型、请求数据类型、相应数据类型...)

    $.ajax({
      url:"register",
      type:"post",
      dataType:"json",
      data:{username:"langkye",password:"admin",gender:"male"},
      success:function(response){
        // 请求成功处理的逻辑;response服务器响应的数据
      },
      error:function(response){
        // 请求失败处理的逻辑;response错误信息
      }
    });
    

    2.2get()方法

    jQuery.get(url, [data], [callback], [type])

    url,[data],[callback],[type] | String,Map,Function,String

    • url:待载入页面的URL地址
    • data:待发送 Key/value 参数。
    • callback:载入成功时回调函数。
    • type:返回内容格式,xml, html, script, json, text, _default。
    $.get("index", 
      { name: "Python", number: 54 },
      function(response){
         // TODO
      }
    );
    

    2.3post()方法

    jQuery.post(url, [data], [callback], [type])

    url,[data],[callback],[type] | String,Map,Function,String

    • url:发送请求地址。
    • data:待发送 Key/value 参数。
    • callback:发送成功时回调函数。
    • type:返回内容格式,xml, html, script, json, text, _default。
    $.post("user/view", 
      { "func": "getAllUsers" },
      function(data){
        // TODO
      }, 
      "json"
    );
    

    2.4load()方法

    load(url, [data], [callback])
    载入远程 HTML 文件代码并插入至 DOM 中。

    • url,[data,[callback]] | String,Map/String,Callback
    • url:待装入 HTML 网页网址。
    • data:发送至服务器的 key/value 数据。在jQuery 1.3中也可以接受一个字符串了。
    • callback:载入成功时回调函数。
    $("#feeds").load("feeds.php", {limit: 25}, function(){
       // TODO
     });
    

    2.5serializeArray()方法

    序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。
    '''注意''',此方法返回的是JSON对象而非JSON字符串。需要使用插件或者第三方库进行字符串化操作。
    返回的JSON对象是由一个对象数组组成的,其中每个对象包含一个或两个名值对——name参数和value参数(如果value不为空的话)

    let fields = $("select, :radio").serializeArray(); // 获取select选框、单选框键和值并序列化为数组对象
    jQuery.each( fields, function(index, field){
      // TODO 
      // index:索引
      // field:每一项键值对
    });
    

    2.6其他方法

    • ajaxComplete(callback)

    AJAX 请求完成时执行函数。Ajax 事件。

    $("#msg").ajaxComplete(function(event,request, settings){
       // TODO 请求完成处理的逻辑
     });
    
    • ajaxError(callback)

    AJAX 请求发生错误时执行函数。Ajax 事件。

    $("#msg").ajaxError(function(event,request, settings){
      // TODO 请求失败处理的逻辑
    });
    
    • ajaxSend(callback)

    AJAX 请求发送前执行函数。Ajax 事件。

    $("#msg").ajaxSend(function(evt, request, settings){
      // TODO 请求开始前处理的逻辑
     });
    
    • ajaxStop(callback)

    AJAX 请求结束时执行函数。Ajax 事件。

    $("#loading").ajaxStop(function(){
      // TODO
     });
    
    • ajaxSuccess(callback)

    AJAX 请求成功时执行函数。Ajax 事件

    $("#msg").ajaxSuccess(function(evt, request, settings){
      // TODO
     });
    
    • jQuery.ajaxSetup([options])

    设置Ajax全局配置

    eq: 设置 AJAX 请求默认地址为 "locaolhost:80/",禁止触发全局 AJAX 事件,用 POST 代替默认 GET 方法。其后的 AJAX 请求不再设置任何选项参数。

    $.ajaxSetup({
      url: "locaolhost:80/",
      global: false,
      type: "POST"
    });
    // 发送请求
    $.ajax({ data: reqData });
    

    更多细节请看 官方文档



    三、Promise

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。

    Promise 能够将异步操作和结果进行分离,通过Pormise的API能够拿到异步操作的处理的结果,解决了”回调地狱“的问题。

    • 基本语法
    let promise = new Promise(function(resolve, reject){
        // resolve, reject 分别对应成功和失败的回调函数
        let isSuccess = true;
        if (isSuccess /* 异步操作成功 */) {
            resolve(value);
        } else {
            reject(error);
        }
    });
    
    • then && catch
    promise.then((response)=>{
      // 处理Promise()返回的数据,和相应的逻辑
    }).catch(error =>{
        // 失败的逻辑
    });
    

    promise.then().then()...

    更多细节参考 官方文档



    四、Fetch

    更多细节参考 MDN官方文档



    五、Axios插件

    Axios下载/ 0.19.2版本

    或直接引入cdn :

    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script>
    

    4.1常用API

    • get()  : 查询

    • post()  :添加

    • put()   :修改

    • delete():删除

    4.2基本语法

    • GET

    以?拼接参数

    axios.get("index?id=3")
      .then((result)=>{ 
        // TODO
      }
    );
    

    以路径作为参数

    axios.get("index/3")
      .then((result)=>{ 
        // TODO
      }
    );
    

    通过对象传递参数

    axios.get("index",
      {id:3},
    ).then((result)=>{
        // TODO
      }
    );
    
    • POST
    axios.post("index.html",
      {uername:"langkye",
        password:"admin"
      })
      .then((result)=>{
        // TODO
      }
    );
    
    • DELETE

    该方法和 GET 类似

    • PUT

    该方法和 POST 类似

    4.3axios参数传递

    • 通过URLSearchParams传递参数(application/x-www-form-urlencoded)
    const params = new URLSearchParams();
    params.append('key1','value1');
    params.append('key2','value2');
    // ...
    axios.post(url,params).then((response)=>{/* TODO */ });
    

    4.4axios响应结果

    4.4.1重要属性

    • data:实际响应数据

    • headers:响应头信息

    • status:响应状态码

    • statusText:响应状态信息

    4.5axios全局配置

    axios.defaults.timeout = 300;  // 响应超时时间
    axios.defaults.baseURL = "http://localhost:80/";  // 默认地址
    axios.defaults.headers['token'] = '...';  // 设置响应头token和值
    axios.defaults.headers['auth'] = '...';  // 设置响应头自定义参数类型和值
    // ...
    

    更多细节请参考 官方文档



    六、async/await

    ES7 所引入的语法,用于处理修饰异步操作

    • async

    异步,修饰函数,表明所修饰的函数为一个异步函数,即修饰处理Promise()请求的函数,必定返回Promise对象。
    该关键字作用在异步方法的声明前

    • await

    等待,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。另一种情况是,await命令后面是一个thenable对象(即定义then方法的对象),那么await会将其等同于 Promise 对象。
    该关键字作用与异步任务前

    so anyway ...

    asycn function foo(){
        const result = await axios.get("index");
        if (result == null) {
            throw "get filed";  // => resolve
        }
        else{
            return result;    // reject
        }
    }
    foo.then((reslut)=>{
      // TODO
    }).catch((error)=>{
       // TODO
    });
    

    官网文档 asycn function() | await

  • 相关阅读:
    Docker部署Kafka以及Spring Kafka操作
    Docker本地镜像上传到阿里云仓库
    Gitlab-CI +Docker + Docker-Compose构建可持续集成java项目的镜像
    Ubuntu安装Gitlab Runner
    Linux安装java环境和maven
    Gitlab CI/CD任务一直处于pending
    C语言中#undef作用
    关于a[i]++和a[i++]说明
    keil4编译Error: User Command terminated, Exit-Code = 1解决
    在keil中添加stc系列单片机型号(模型)方法
  • 原文地址:https://www.cnblogs.com/langkyeSir/p/13293024.html
Copyright © 2011-2022 走看看