Vue(3)

前后端交互

  1. 前后端交互模式
  2. Promise用法
  3. 接口调用-fetch用法
  4. 接口调用-async/await用法
  5. 接口调用-async/await用法

接口调用方式

  • 原生Ajax
  • 基于jQuery的Ajax
  • fetch
  • axios

URL地址格式

  1. 传统形式的URL

    • 格式:schema://host:port/path?query#fragment
      1. schema:协议。例如http、https、ftp等
      2. host:域名或者IP地址
      3. port:端口。http默认端口80,可以省略
      4. path:路径。例如/abc/a/b/c
      5. query:查询参数。例如uname=zhangsan&age=12
      6. fragment:锚点(哈希Hash),用于定位页面的某个位置
  2. Restful形式的URL

    • http请求方式
      1. GET:查询
      2. POST:添加
      3. PUT:修改
      4. DELETE:删除

Promise用法

  • 异步调用
    • 异步效果分析
      • 定时任务
      • Ajax
      • 事件函数
    • 多次异步调用的依赖分析
      • 多次异步调用的结果顺序不确定

      • 异步调用的结果如果存在依赖需要嵌套

        // 回调地狱,代码结构太复杂,想象一下就好
        

Promise概述:Promise是异步编程的一种解决方案,从语法上将:从它可以获取异步操作的消息

使用Promise主要有以下好处

  • 可以避免多层异步调用嵌套问题(回调地狱)
  • Promise对象提供了简洁的API,使得控制异步操作更加容易
  1. 实例化Promise对象,构造函数中传递函数,该函数用于处理异步任务

  2. resolvereject两个参数用于处理成功和失败两种情况,并通过p.then获取处理结果

    var p = new Promise(function(resolve, rejected) {
        // 成功时调用  resolve()
        // 失败时调用  rejected()
    });
    p.then(function(ret){
        // 从resolve得到正常结果
    }, function(ret){
        // 从rejected得到错误信息
    })
    

基于Promise处理Ajax请求

// 处理原生Ajax
function queryData(){
    var p = new Promise(function(resolve, rejected){
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if(xhr.readyState!=4) return;
            if(xhr.readyState===4&&xhr.status===200){
                // 处理正常情况
                resolve(xhr.responseText);
            }else{
                // 处理异常情况
                reject('服务器错误');
            }
        };
        xhr.open('get',url);
        xhr.send(null);
    });
    return p;
}
  • 发送多次Ajax请求,并且保证顺序

    queryData()
        .then(function(data){
            return queryData();
        })
        .then(function(data){
            return queryData();
        })
        .then(function(data){
            return queryData();
        });
    
  • then参数中的函数返回值

    1. 返回Promise实例对象
      • 返回的该实例对象会调用下一个then
    2. 返回普通值
      • 返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收该值

Promise常用的API

  1. 实例方法

    • p.then() 得到异步任务的正确结果
    • p.catch() 获取异常信息
    • p.finally() 成功与否都会执行(尚且不是正式标准)
    queryData()
        .then(function(data){
            console.log(data);
        })
        .catch(function(data){
            console.log(data);
        })
        .finally(function(){
            console.log('finished');
        });
    
  2. 对象方法

    • Promise.all() 并发处理多个异步任务,所有的任务都执行完成才能得到结果
    • Promise.race() 并发处理多个异步任务,只要有一个任务完成就能得到结果
    Promise.all([p1,p2,p3]).then((result) => {
        console.log(result);
    });
    Promise.race([p1,p2,p3]).then((result) => {
        console.log(result);
    })
    

接口调用-fetch

  • 基本特性:

    • 更加简单的数据获取方式,功能更强大,更灵活,可以看作xhr的升级版
    • 基于Promise实现
  • 语法结构

    fetch(url).then(f2)
              .then(f3)
              ...
              .catch(fn)
    
  • fetch的基本语法

    fetch('/abc').then(data => {
        return data.text();
    }).then(ret=>{
        // 这里得到的才是最终的数据
        console.log(ret);
    })
    
  1. fetch 请求参数

    • 常用配置项

      • method(String):HTTP请求方法,默认为GET(GET、POST、PUT、DELETE)
      • body(String):HTTP的请求参数
      • headers(Object):HTTP请求头,默认为{}
      fetch('/abc', {
          method: 'get'
      }).then(data=>{
          return data.text();
      }).then(ret=>{
          // 这里才是最终得到的数据
          console.log(ret);
      })
      
    • GET请求方式的参数传递

        ```javascript
        fetch('/abc?id=123').then(data=>{
            return data.text();
        }).then(ret=>{
        // 这里才是最终得到的数据
        console.log(ret);
        })
        ```
      
        ```javascript
        fetch('/abc', {
            method: 'get'
        }).then(data=>{
            return data.text();
        }).then(ret=>{
            // 这里才是最终得到的数据
            console.log(ret);
        })
        ```
      
    • DELETE请求方式的参数传递

      fetch('/abc', {
          method: 'delete'
      }).then(data=>{
          return data.text();
      }).then(ret=>{
          // 这里才是最终得到的数据
          console.log(ret);
      })
      
    • POST请求的参数传递

      fetch('/books', {
          method: 'post',
          body: 'uname=zhangsan&pwd=123',
          headers: {
              'Content-Type': 'application/json'
          }
      }).then(data=>{
          return data.text();
      }).then(ret=>{
          console.log(ret);
      });
      
      fetch('/books', {
          method: 'post',
          body: JSON.stringify({
              uname: 'zhangsan',
              age: 12
          }),
          headers: {
              'Content-Type': 'application/json'
          }
      }).then(data=>{
          return data.text();
      }).then(ret=>{
          console.log(ret);
      });
      
    • PUT请求参数的传递

      fetch('/books', {
          method: 'put',
          body: JSON.stringify({
              uname: 'zhangsan',
              age: 12
          }),
          headers: {
              'Content-Type': 'application/x-www-form-urlencoded'
          }
      }).then(data=>{
          return data.text();
      }).then(ret=>{
          console.log(ret);
      });
      
  2. fetch 响应结果

    • text():将返回体处理成字符串类型
    • json():返回结果和JSON.parse(response)一样
    fetch('/abc').then(data=>{
        // return data.text();
        return data.json();
    }).then(ret=>{
        console.log(ret);
    })
    

接口调用-axios

axios(官网:https://github.com/axios/axios) 是一个基于promise用于浏览器和node.js的HTTP客户端

  • 它具有以下特性

    • 支持浏览器和node.js
    • 支持promise
    • 能拦截请求和响应
    • 自动转换JSON数据
  • 基本用法

    axios.get('/adata')
         .then(ret=>{
             // data属性名称是固定的,用于获取后台响应数据
             console.log(ret.data);
         })
    

axios常用的API

  • get:查询数据
  • post:添加数据
  • put:修改数据
  • delete:删除数据

axios的参数传递

  • GET传递参数

    • 通过URL传递参数

      axios.get('/adata?id=123')
           .then(ret=>{
               console.log(ret.data);
           })
      
      axios.get('/adata/123')
           .then(ret=>{
               console.log(ret.data);
           })
      
    • 通过params选项传递参数

      axios.get('/adata',{
          params: {
              id: 123
          }
      })
           .then(ret=>{
               console.log(ret.data);
           })
      
  • DELETE传递参数

    • 参数传递方式与GET类似

      axios.delete('/adata?id=123')
           .then(ret=>{
               console.log(ret.data);
           })
      
      axios.delete('/adata/123')
           .then(ret=>{
               console.log(ret.data);
           })
      
      axios.delete('/adata',{
          params: {
              id: 123
          }
      })
           .then(ret=>{
               console.log(ret.data);
           })
      
  • POST传递参数

    • 通过选项传递参数(默认传递的是json格式的数据)

      axios.post('/adata', {
          uname: 'tom',
          pwd: 123
      }).then(ret=>{
          console.log(ret.data) 
      })
      
    • 通过URLSearchParams传递参数(application/x-www-form-urlencoded)

      const params = new URLSearchParams();
      params.append('param1', 'value1');
      params.append('param2', 'value2');
      axios.post('/api/test', params).then(ret=>{
          console.log(ret.data);
      })
      
  • PUT请求

    • 参数传递方式与POST类似

      axios.put('/adata', {
          uname: 'tom',
          pwd: 123
      }).then(ret=>{
          console.log(ret.data) 
      })
      

axios 的响应结果

  • 响应结果的主要属性

    • data:实际响应回来的数据
    • headers:响应头信息
    • status:响应状态码
    • statusText:响应状态信息
  • axios 的全局配置

    • axios.defaults.timeout=3000; 超过时间
    • axios.defaults.baseURL='http://localhost:3000/app'; 默认地址
    • axios.defaults.headers['mytoken']= 'aqwerwqwerqwer2ewrwe23eresdf23' 设置请求头

axios 拦截器

  1. 请求拦截器

    • 在请求发出之前设置一些信息
    // 添加一个请求拦截器
    axios.interceptors.request.use(function(config) {
        // 在请求之前进行一些信息设置
        return config;
    },function(err) {
        // 处理响应的错误信息
    });
    
  2. 响应拦截器

    • 在获取数据之前对数据做一些加工处理
    // 添加一个响应拦截器
    axios.interceptors.response.use(function(res) {
        // 在这里对返回的数据进行处理
        return config;
    },function(err) {
        // 处理响应的错误信息
    });
    

接口调用-async/await 的基本用法

  • async/await是ES7引入的新语法,可以更加方便地进行异步操作
  • async关键字用于函数上(async函数的返回值是Promise实例对象)
  • await关键字用于async函数内部(await可以得到异步的结果)
async function queryData(id) {
    const ret = await axios.get('/data');
    return ret;
}
queryData.then(ret=>{
    console.log(ret)
})

async/await处理多个异步请求

// 多个异步请求的场景
async function queryData(id) {
    const info = await axios.get('/async');
    const ret = await axios.get(`async2?info=` + info.data);
    return ret;
}
queryData.then(ret=>{
    console.log(ret);
})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342