认识前后端交互

147 阅读6分钟

认识前后端交互

在开发中 我们一定离不开前后端交互

其实就是前端向后端发送请求, 想要获取到某一个数据

目前 前后端交互的一个主流方式就是利用 ajax (主要是一个 axios 比较火)

  1. 利用 ajax 完成一个前后端交互
    // 1. 创建一个 ajax
    const xhr = new XMLHttpRequest()
    
    // 2. 配置 ajax  
    // xhr.open('以什么方式请求, 目前开发中只有 post/get', '向谁发送请求', '第三个参数暂时欠着, 可以不写')
    xhr.open('GET', 'http://localhost:8888/test/first')

    // 3. 发送 ajax
    xhr.send()

    // 4. 监听 请求完成的时间
    xhr.onload = function () {
    // 4.1 请求完成的时候, 说明数据已经给到我们前端, 我们开始使用
     console.log(xhr.responseText)
    }

ajsx 的异步问题

其实就是配置 ajax 的第三个参数

这个参数默认是 true 表示当前的请求是 异步

  • 异步: 1, 2, 3, 4
    1. 创建(同步)
    2. 配置(同步)
    3. 发送(异步)
    4. 监听(同步)
        // 异步: 1 2 3 4
        // 1. 创建一个 ajax
        const xhr = new XMLHttpRequest()
        // 2. 配置 ajax
        xhr.open('GET', 'http://localhost:8888/test/first')
        // 3. 发送 ajax
        xhr.send()
        // 4. 监听 ajax 完成
        xhr.onload = function () {
            console.log(xhr.responseText)
        }
  • 异步: 1, 2, 4, 3
    1. 创建(同步)
    2. 配置(同步)
    3. 监听(同步)
    4. 发送(异步)
         // 异步: 1 2 4 3
        // 1. 创建一个 ajax
        const xhr = new XMLHttpRequest()
        // 2. 配置 ajax
        xhr.open('GET', 'http://localhost:8888/test/first')
        // 4. 监听 ajax 完成
        xhr.onload = function () {
            console.log(xhr.responseText)
        }
        // 3. 发送 ajax
        xhr.send()
  • 同步: 1, 2, 4, 3
    1. 创建(同步)
    2. 配置(同步)
    3. 监听(同步)
    4. 发送(同步)
    // 同步: 1 2 4 3
        // 1. 创建一个 ajax
        const xhr = new XMLHttpRequest()
        // 2. 配置 ajax
        xhr.open('GET', 'http://localhost:8888/test/first', false)
        // 4. 监听 ajax 完成
        xhr.onload = function () {
            console.log(xhr.responseText)
        }
        // 3. 发送 ajax
        xhr.send()

  • 同步: 1, 2, 3, 4
    1. 创建(同步)
    2. 配置(同步)
    3. 发送(同步)  只有当前代码执行完毕 才会去执行下一步, 只有请求完毕后 才会向下继续执行
    4. 监听(同步)  只有请求完毕后才会加载当前代码, 但是当前代码加载完毕的时候, 请求早就结束了, 所以当前的监听函数不会执行了
         // 同步: 1 2 3 4
        // 1. 创建一个 ajax
        const xhr = new XMLHttpRequest()
        // 2. 配置 ajax
        xhr.open('GET', 'http://localhost:8888/test/first', false)
        // 3. 发送 ajax
        xhr.send()
        // 4. 监听 ajax 完成
        xhr.onload = function () {
            console.log(xhr.responseText)
        }

ajax 的状态码

利用了一个数字表明 ajax 当前运行到哪一步了

  1. ajax 创建完毕
  2. ajax 配置完成
  3. ajax 发送完毕 (后端已经对请求作出响应, 并把请求返回给 浏览器)
  4. 浏览器开始解析后端返回的内容, 如果返回的数据比较少, 那么此时 就可以使用数据了, 但是有可能没有解析完毕, 数据不完整, 所以不推荐在这里使用数据
  5. 浏览器的解析的内容已经全部处理完毕, 我们可以开始使用数据了
    const xhr = new XMLHttpRequest()
    
    xhr.open('GET', 'http://localhost:8888/test/first')
    
    xhr.send()
    
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4) {
            console.log('4 -----> 浏览器解析完毕解析', xhr.responseText)
        }
    }
    
    xhr.onload = function () {
        console.log('请求完毕  onload 加载: ', xhr.responText)
    }

http 协议

当前协议规定 请求 只能是 前端发起的, 并且在传输过程中, 只能传递字符串

  1. 建立连接

    • 浏览器和服务器 建立连接
  2. 发送请求

    • 如果需要携带一些参数, 那么需要以请求报文的形式传递
    • 报文游览器进行组装, 我们只需要传递一些对应的信息
  3. 接受相应

    • 根据请求报文内的相关信息, 确定现在需要做什么事情, 并把必要的数据进行返回
    • 返回的内容需要放在 相应报文中
  4. 关闭连接

    • 浏览器和服务器的连接到此结束

综上所述, 我们的每一次请求都是完全独立的, 前一个请求和后一个请求没有任何联系

哪怕两次请求之间的间隔很短, 那么也没有任何的关联

重点:

  • 请求状态码
    • 100 ~ 199:    连接正在进行中(持续进行)
    • 200 ~ 299:    表明连接成功
    • 300 ~ 399:    表明重定向
    • 400 ~ 499:    表示前端错误  (没权限/传参错误)
    • 500 ~ 599:    表明后端错误

请求方式的差异

GET:    获取的含义

POST:    提交的含义

  • 请求方式最就大的差异就是传参
    • 传承的方式
      • GET: 直接在地址后边拼接参数即可, 格式类似于以前的 查询字符串
      • POST: 在请求体内书写(其实就是 xhr.send(这小括号内))
    • 传承的大小
      • GET: 2kb 左右
      • POST: 原则上没有限制, 但是我们可以在后端添加限制
    • 传承的安全性
      • GET: 明文传输, 相对安全
      • POST: 密文传输, 相对安全
    • 传参的格式
      • GET: 传递的是查询字符串格式
      • POST: 原则上也没有限制, 但是传参的时候需要通过 content-type 指定我们传参的格式

测试请求

测试请求1

    const xhr = new XMLHttpRequst()
    xhr.open('GET', 'http://localhost:8888/test/first')
    xhr.send()
    xhr.onload = function () {
        console.log(xhr.responseText)
    }

测试请求2

    const xhr = new XMLHttpRequest()
    xhr.open('GET', 'hhttp://localhost:8888/test/second')
    xhr.send()
    xhr.onload = function () {
        const res = JSON.parse(xhr.responseText)
        if (res.code === 0) {
            console.log('此时可能请求失败, 做一些什么事情...')
            return 
        }
        // 如果代码能够运行到这里, 说明请求成功, 我们可以做成功后的一些事情
        console.log('此时请求完毕: ', res )
    }

测试请求3

    const xhr = new XMLHttpRequ()
    
        // xhr.open('GET', 'http://localhost:8888/test/third?key=value&key2=value2')
        // xhr.open('GET', 'http://localhost:8888/test/third?name=QF001&age=18')
        // xhr.open('GET', 'http://localhost:8888/test/third?name=QF001')\
    xhr.open('GET', 'http://localhost:8888/test/third?age=18')
    xhr.send()
    xhr.load = functionn() {
        const res = JSON.parse(xhr.responseText)
        
        if(res.code === 0) {
            console.log('此时可能请求失败, 做一些什么事情...')
            
            return
        }
        
        // 如果代码能够运行到这里, 说明请求成功, 我们可以做成功后的一些事情
        console.log('此时请求完毕: ', res)
    }
    

post 请求携带参数

post 的参数必须书写在 xhr.send() 的小括号中

并且 我们也可以传递 查询字符串

那么可以尝试自己书写一下, 看一下能否正确请求成功

    // 1. 创建 
    const xhr = new XMLHttpRequest()
    
    // 配置
    xhr.open('POSTT', 'http://localhost:8888/test/fourth')
    
    // 如果是 post 方式, 并且需要携带参数, 那么需要加一步 设置请求头
    
    // xhr.setRequestHeader('content-type', 'application/josn')   // 如果参数是 json 字符串, 需要这样写
    
    
    xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')  //如果参数是查询字符串 ,需要这样书写
    
    // 发送
    // xhr.send('key=value&key2=value')
    
    xhr.send('name=张三&age=18')
    
    // 监听请求完毕
    xhr.onload = function () {
        const res = JSON.parse(xhr.responseText)
        
        console.log(res)
    }