最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端与后端通信的几种方式

    正文概述 掘金(绝对值的几何意义)   2021-02-04   612

    在项目中,通常前端开发主要完成两件事情,一是界面搭建,一是数据交互。

    下面是我总结前端与后端交互的几种方式,本文只作简单介绍,不做深入了解。

    一、AJAX

    简述

    AJAX(Asynchronous Javascript And XML),是一种使用 XMLHttpRequest 技术构建更复杂,动态的网页的编程实践。

    XMLHttpRequest(XHR)对象由微软引入,首次在 IE5 上实现,是一种支持异步请求的技术,用于与服务器交互。XMLHttpRequest 可以在不刷新页面的情况下请求 URL 获取服务器数据,然后使用 JavaScript 操作 DOM 更新页面数据,是 AJAX 编程技术的核心。 这样网页在不影响用户操作的情况下,就可以更新页面的局部内容,用户体验由此得到了很大的提升。在此之前,要实现这种 AJAX 式的通信则要采用内嵌框架或隐藏框架等 hack 手段才能实现。

    除了原生 JS 外,jQuery、Axios、vue-resource 都可以实现 Ajax 编程。


    原生JS

    var url = 'https://api.github.com/users/chriscoyier/repos'
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url, false)
    xhr.onreadystatechange = function() {
      if(xhr.readyState === 4) {
        if(xhr.status === 200 || xhr.status === 304) {
          console.log('response:', xhr.response)
        }
      }
    }
    xhr.send()
    

    封装起来

    var Ajax = {
        get: function(url, callback) {
            var xhr = new XMLHttpRequest()
            xhr.open('GET', url, false)
            xhr.onreadystatechange = function() {
                if(xhr.readyState === 4) {
                    if(xhr.status === 200 || xhr.status === 304) {
                        console.log(xhr.response)
                        callback(xhr.response)
                    }
                }
            }
            xhr.send()
        },
    
        post: function(url, data, callback) {
            var xhr = new XMLHttpRequest()
            xhr.open('POST', url, false)
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200 || xhr.status === 304) {
                        console.log(xhr.response)
                        callback(xhr.response)
                    }
                }
            }
            xhr.send(data)
        }
    }
    

    jQuery

    jQuery 下实现 Ajax 非常简单

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
    <script>
      $(function(){
          const list = {}
          const url = ''
          $.ajax({
              type: "POST",
              contentType: "application/json;charset=UTF-8",
              url: url,
              data: JSON.stringify(list),
              success: res => console.log('res', res),
              error: err => console.log('err', err)
          })
      })
    </script>
    

    vue-resource

    vue-resource 是 vuejs 的一个插件,在 vue1.x 的时候被广泛使用,可以通过 XMLHttpRequest 或 JSONP 发送请求和处理响应数据。

    通过 npm 或者 yarn 安装

    $ yarn add vue-resource
    $ npm install vue-resource
    

    通过 CDN 引入

    <script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1"></script>
    

    使用

    this.$http.get('https://api.github.com/users/chriscoyier/repos')
            .then(res => console.log('res:', res.body),err => console.log('err:', err))
    

    Axios

    Axios 可以用在浏览器和 node.js 中,是一个基于 promise 的 HTTP 库,是 vuejs 官网推荐使用的一种方式。

    使用 npm

    $ npm install axios
    

    使用 bower

    $ bower install axios
    

    使用 cdn

    // 同步最新版本,但不建议使用,会出现访问不了的问题
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    // 建议使用指定版本的方式
    <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>
    

    完成请求

    axios.get('https://api.github.com/users/chriscoyier/repos')
              .then(res => console.log('res:', res.data),err => console.log('err:', err))
    

    Promise

    使用 ES6 的 Promise 完成 Get 请求

    const url = 'https://api.github.com/users/chriscoyier/repos'
    const getData = function(url) {
      const promise = new Promise(function(resolve, reject) {
          const handler = function() {
              if (this.readyState !== 4) {
                  return
              }
              if (this.status === 200) {
                  resolve(this.response)
              } else {
                  reject(new Error(this.statusText))
              }
          }
          const xhr = new XMLHttpRequest()
          xhr.open("GET", url)
          xhr.onreadystatechange = handler
          xhr.responseType = "json"
          xhr.setRequestHeader("Accept", "application/json")
          xhr.send()
    
      })
      return promise
    }
    getData(url)
      .then(res => console.log('data: ', res), err => console.log('err: ', err))
    

    二、Fetch

    简介

    Fetch 基于 Promise,提供了一个获取资源的接口(包括跨域请求)。其全局方法 fetch() 方法要求必须接收一个资源路径,无论请求成功与否,它都返回一个 Promise 对象,resolve 对应请求的 Response。相较于 XMLHttpRequest,它更高效和具有扩展性。

    Fetch 的核心在于对 HTTP 接口的抽象,包括 Request,Response,Headers,Body,以及用于初始化异步请求的 global fetch。

    使用 Fetch

    fetch('https://api.github.com/users/chriscoyier/repos')
      .then(res => res.json())
      .then(res => {
        console.log('res', res[0].blobs_url)
      })
    

    三、WebSocket

    简介

    WebSocket 是 HTML5 提供的一种在单个 TCP 连接上进行全双向通讯的网络协议,于 2008 年发布,到 2011 年所有浏览器就都支持了。它的出现弥补了 HTTP 协议只能由客户端向服务器发起请求的缺陷。在此之前,要实现服务器向客户端推送数据只能采取Ajax轮询的方式,即每隔一段时间,就发出一个请求询问服务器有没有新的消息,这种方式导致 HTTP 一直处于打开状态,效率非常低下,因此工程师们发明了 WebSocket。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    下面就是一个 WebSocket 协议,ws 表示协议符,与 https 对应的,wss 表示 ws 的加密形式。端口上与 http 保持了很好的兼容性,也是 80/443,但没有 http 的同源限制,可以任意与服务器通信。

    ws://example.com:80/some/path
    

    客户端实现

    一个网页脚本的例子

    
    // 执行下面语句之后,客户端就会与服务器进行连接。
    var ws = new WebSocket("wss://echo.websocket.org");
    
    ws.onopen = function(evt) { 
      console.log("Connection open ..."); 
      ws.send("Hello WebSockets!");
    };
    
    ws.onmessage = function(evt) {
      console.log( "Received Message: " + evt.data);
      ws.close();
    };
    
    ws.onclose = function(evt) {
      console.log("Connection closed.");
    };      
    
    

    四、Form 表单

    Form 是 HTML 中的一个元素,表示文档中的某一个区域,通常会有很多子元素,这些子元素提供了交互的作用,用于向 web 服务器提供数据。

    <form action="" method="get" class="form-example">
      <div class="form-example">
        <label for="name">Enter your name: </label>
        <input type="text" name="name" id="name" required>
      </div>
      <div class="form-example">
        <label for="email">Enter your email: </label>
        <input type="email" name="email" id="email" required>
      </div>
      <div class="form-example">
        <input type="submit" value="Subscribe!">
      </div>
    </form>
    
    

    action 表示处理表单提交的 URL。这个值可被 <button><input type="submit"><input type="image"> 元素上的 formaction 属性覆盖。

    参考文档

    developer.mozilla.org/zh-CN/

    jquery.cuishifeng.cn/jQuery.Ajax…

    github.com/pagekit/vue…

    www.axios-js.com

    www.ruanyifeng.com/blog/2017/0…

    developer.mozilla.org/zh-CN/docs/…


    起源地下载网 » 前端与后端通信的几种方式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元