Vue之前后端交互模式

news2024/11/19 22:54:30

1. fetch-API的使用

1.1 init

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 
        0. using Fetch: https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch; 
        1. Fetch API 提供了一个获取资源的接口(包括跨域请求)。
           任何使用过 XMLHttpRequest 的人都能轻松上手,而且新的 API 提供了更强大和灵活的功能集; 
        2. Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应; 
           它还提供了一```全局 fetch()方法```,该方法提供了一种简单,合理的方式来跨网络异步获取资源; 
     -->

     <!-- 
         fetch(...) => https://developer.mozilla.org/zh-CN/docs/Web/API/fetch
         格式:Promise<Response> fetch(input[, init]);
             1. 参数:
                    (1) input:  定义要获取的资源。这可能是:
                            a. 一个 USVString 字符串,包含要获取资源的 URL; 
                            b. 一个 Request 对象; 
                    (2) init: 一个配置项对象,包括所有对请求的设置。可选的参数有:
                            method:         请求使用的方法,如 GET、POST; 
                            headers:        请求的头信息, ,形式为 Headers 的对象或包含 ByteString 值的对象字面量; 
                            body:           请求的body信息:可能是一个Blob、BufferSource (en-US)、FormData、URLSearchParams 或者 USVString 对象;
                            mode:           请求的模式,如 cors、 no-cors 或者 same-origin; 
                            credentials:    ...
                            cache:          ...
                            redirect:       ...
                            referrer:       ...
                            referrerPolicy: ...
                            integrity:      ...
             2. 返回值:
                    ```它返回一个 promise,这个 promise会在请求响应后被 resolve,并传回Response对象```; 
             3. 与fetch()相关联的对象:
                    (1) Response对象: Fetch API 的 Response 接口呈现了对一次请求的响应数据; 
                    (2) Request对象: Fetch API 的 Request接口用来表示资源请求; 
                    (3) Headers对象: Fetch API 的 Headers 接口允许您对HTTP请求和响应头执行各种操作; 
      -->
</head>
<body>
    
</body>
</html>

1.2 基本使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            fetch()函数返回一个 promise,这个 promise会在请求响应后被 resolve,并传回Response对象;
            通过response.text(): 它返回一个包含USVString对象(也就是文本)的Promise对象,返回结果的编码永远是 UTF-8;
        */
        fetch('http://localhost:3000/fdata')    // 返回一个Promise对象
            .then(function (response) {
                return response.text();         // response.text()又是一个Promise对象
            })
            .then(function (text) {
                // console.log(text);
                alert(text); 
            });
    </script>
</body>

</html>

1.3 参数传递

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <script type="text/javascript">
        // 1. GET参数传递-传统URL
        /*
            fetch('http://localhost:3000/books?id=123', {
                    method: 'get'
                })
                .then(function (response) {
                    return response.text();
                }).then(function (text) {
                    alert(text); 
                });
        */


        // 2. GET参数传递-restful形式的URL
        /*
            fetch('http://localhost:3000/books/456', {
                    method: 'get'
                })
                .then(function (response) {
                    return response.text();
                }).then(function (text) {
                    alert(text); 
                });
        */


        // DELETE请求方式参数传递
        /*
            fetch('http://localhost:3000/books/789', {
                    method: 'delete'
                })
                .then(function (response) {
                    return response.text();
                }).then(function (text) {
                    alert(text); 
                });
        */


        // POST请求传参(uname=lisi&pwd=123形式)
        /*
            fetch('http://localhost:3000/books', {
                    method: 'post',
                    body: 'uname=lisi&pwd=123',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded'
                    }
                })
                .then(function (response) {
                    return response.text();
                }).then(function (text) {
                    alert(text); 
                });
        */

        
        // POST请求传参(json格式)
        /*
            fetch('http://localhost:3000/books', {
                    method: 'post',
                    body: JSON.stringify({
                        uname: '张三',
                        pwd: '456'
                    }),
                    headers: {
                        'Content-Type': 'application/json'
                    }
                })
                .then(function (response) {
                    return response.text();
                })
                .then(function (text) {
                    alert(text);
                });
        */


        // PUT请求传参
            fetch('http://localhost:3000/books/123', {
                    method: 'put',
                    body: JSON.stringify({
                        uname: '张三',
                        pwd: '789'
                    }),
                    headers: {
                        'Content-Type': 'application/json'
                    }
                })
                .then(function (response) {
                    return response.text();
                })
                .then(function (text) {
                    alert(text);
                });
        
    </script>
</body>

</html>

1.4 响应数据格式

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- 
        Fetch响应结果的数据格式
     -->
</head>

<body>
    <script type="text/javascript">
    /*
        fetch('http://localhost:3000/json').then(function (response) {
                return response.json();
            })
            .then(function (json) {
                console.log(json);
            }); 
    */
        
            fetch('http://localhost:3000/json').then(function (response) {
                return response.text();
            })
            .then(function (jsonText) {
                // console.log(jsonText);              // "{"uname":"lisi","age":13,"gender":"male"}"
                console.log(JSON.parse(jsonText)); 
            }); 
        
    </script>
</body>

</html>

2. axios库的基本使用

2.1 init

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- 
        1. https://www.axios-http.cn/docs/intro
        2. Axios是什么?
            基于promise可以用于浏览器和node.js的网络请求库; 
            Axios 是一个基于promise网络请求库,作用于node.js 和 浏览器中; 
            它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中); 
            在服务端它使用原生node.js中的http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests; 
        2. 具备以下特征:
            a. 从浏览器创建 XMLHttpRequests; 
            b. 从 node.js 创建 http 请求; 
            c. 支持 Promise API; 
            d. 拦截请求和响应; 
            e. 转换请求和响应数据; 
            f. 取消请求; 
            g. 自动转换JSON数据; 
            h. 客户端支持防御XSRF; 
     -->
</head>
<body>

</body>
</html>

2.2 基本使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- 
        URLSearchParams对象; 
     -->
</head>

<body>
    <!-- 引入axios网络库 -->
    <script type="text/javascript" src="../js/axios.js"></script>
    <!-- 发起axios网络请求 -->
    <script type="text/javascript">
        axios.get('http://localhost:3000/adata')
            .then(function (response) {
                console.log(response);
                alert(response.data);
            });
    </script>
</body>

</html>

2.3 参数传递

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <script type="text/javascript" src="../js/axios.js"></script>
    <script type="text/javascript">
        /************************************* axios get请求传参 ***********************************/
        // [1.] 传统URL传参
        /*
            axios.get('http://localhost:3000/axios?id=123')
                .then(function (response) {
                    console.log(response.data); 
                }); 
        */

        // [2.] restful风格传参
        /*
            axios.get('http://localhost:3000/axios/123')
                .then(function (response) {
                    console.log(response.data); 
                });
        */

        // [3.] params传参(axios请求配置对象中的一个属性, 必须是一个简单对象 或 URLSearchParams对象)
        /*
            axios.get('http://localhost:3000/axios', {
                    params: {               // 自动被转换成?id=789形式
                        id: 789
                    }
                })
                .then(function (response) {
                    console.log(response.data); 
                });
        */


        /************************************* axios delete请求传参 ***********************************/
        /*
            axios.delete('http://localhost:3000/axios', {
                    params: {
                        id: 111
                    }
                })
                .then(function (response) {
                    console.log(response.data); 
                }); 
        */


        /************************************* axios post请求传参 ***********************************/
        /*
            axios.post('http://localhost:3000/axios', {
                    uname: 'lisi',
                    pwd: 123
                })
                .then(function (response) {
                    console.log(response.data);
                });
            let params = new URLSearchParams();
            params.append('uname', 'zhangsan');
            params.append('pwd', '111');
            axios.post('http://localhost:3000/axios', params)
                .then(function (response) {
                    console.log(response.data); 
                });
        */


        /************************************* axios put请求传参 ***********************************/

        axios.put('http://localhost:3000/axios/123', {
                uname: 'lisi',
                pwd: 123
            })
            .then(function (response) {
                console.log(response.data); 
            });
    </script>
</body>

</html>

2.4 响应结果

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>

    <script type="text/javascript" src="../js/axios.js"></script>
    <script type="text/javascript">
    /* 服务器返回json格式数据, 浏览器端的axios将会自动解析json数据格式, response.data就是json对象 */
        axios.get('http://localhost:3000/axios-json')
            .then(function (response) {
                console.log(response.data); 
            }); 
    </script>
</body>

</html>

2.5 全局配置

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>

    <script type="text/javascript" src="../js/axios.js"></script>
    <script type="text/javascript">
        // 配置请求的基准URL地址
        axios.defaults.baseURL = 'http://localhost:3000/';
        // 配置请求头信息
        axios.defaults.headers['mytoken'] = 'hello';
        axios.get('axios-json')             // 因为baseURL的存在, 相当于http://localhost:3000/axios-json请求地址
            .then(function (ret) {
                console.log(ret.data.uname)
            });
    </script>
</body>

</html>

2.6 axios拦截器

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <script type="text/javascript" src="../js/axios.js"></script>
    <script type="text/javascript">
// 1. 添加请求拦截器
        axios.interceptors.request.use(
            // 在发送请求前做些什么
            function (config) {
                console.log(config);
                config.headers.mytoken = 'nihao';
                return config;
            },
            // 对请求错误做些什么
            function (err) {
                console.log(err)
            });

// 2. 添加响应拦截器
        axios.interceptors.response.use(
            // 对响应数据做点什么
            function (response) {
                return response.data;   // 直接将response.data给返回出去, 此时在then中就可以直接拿到data数据了
            },
            // 对响应错误做点什么
            function (err) {
                console.log(err)
            }); 

        axios
            .get('http://localhost:3000/adata')
            .then(function (data) {
                console.log('***> ' + data); 
            }); 
    </script>
</body>

</html>

在这里插入图片描述

3. index.js

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
// 处理静态资源
app.use(express.static('public'))
// 处理参数
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// 设置允许跨域访问该服务
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  res.header('Access-Control-Allow-Headers', 'mytoken');
//   res.header('Access-Control-Allow-Headers', '*');
  next();
});
app.get('/async1', (req, res) => {
  res.send('hello1')
})
app.get('/async2', (req, res) => {
  if(req.query.info == 'hello') {
    res.send('world')
  }else{
    res.send('error')
  }
})

app.get('/adata', (req, res) => {
  res.send('Hello axios!')
})
app.get('/axios', (req, res) => {
  res.send('axios get 传递参数' + req.query.id)
})
app.get('/axios/:id', (req, res) => {
  res.send('axios get (Restful) 传递参数' + req.params.id)
})
app.delete('/axios', (req, res) => {
  res.send('axios delete 传递参数' + req.query.id)
})
app.post('/axios', (req, res) => {
  res.send('axios post 传递参数' + req.body.uname + '---' + req.body.pwd)
})
app.put('/axios/:id', (req, res) => {
  res.send('axios put 传递参数' + req.params.id + '---' + req.body.uname + '---' + req.body.pwd)
})

app.get('/axios-json', (req, res) => {
  res.json({
    uname: 'lisi',
    age: 12
  });
})


app.get('/fdata', (req, res) => {
  res.send('Hello Fetch!')
})
app.get('/books', (req, res) => {
  res.send('传统的URL传递参数!' + req.query.id)
})
app.get('/books/:id', (req, res) => {
  res.send('Restful形式的URL传递参数!' + req.params.id)
})
app.delete('/books/:id', (req, res) => {
  res.send('DELETE请求传递参数!' + req.params.id)
})
app.post('/books', (req, res) => {
  res.send('POST请求传递参数!' + req.body.uname + '---' + req.body.pwd)
})
app.put('/books/:id', (req, res) => {
  res.send('PUT请求传递参数!' + req.params.id + '---' + req.body.uname + '---' + req.body.pwd)
})

app.get('/json', (req, res) => {
  res.json({
    uname: 'lisi',
    age: 13,
    gender: 'male'
  });
})

app.get('/a1', (req, res) => {
  setTimeout(function(){
    res.send('Hello TOM!')
  },1000);
})
app.get('/a2', (req, res) => {
  setTimeout(function(){
    res.send('Hello JERRY!')
  },2000);
})
app.get('/a3', (req, res) => {
  setTimeout(function(){
    res.send('Hello SPIKE!')
  },3000);
})

// 路由
app.get('/data', (req, res) => {
  res.send('Hello World!')
})
app.get('/data1', (req, res) => {
  setTimeout(function(){
    res.send('Hello TOM!')
  },1000);
})
app.get('/data2', (req, res) => {
  res.send('Hello JERRY!')
})

// 启动监听
app.listen(3000, () => {
  console.log('running...')
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机常识汇总

目录 一、手机历史介绍 第一代模拟制式手机(1G) 什么是模拟网? 模拟网络与数字网络的区别 数字通信与模拟通信相比具有明显的优点: 第二代数字手机(2G) 什么是“GSM” 什么是 “CDMA”? GSM 数字机和模拟手机话音相比 什么是“GSM/CDMA 双模机”? 什么是“TDMA”…

FinChat.io,金融领域的chatgpt

投资股票是一个充满挑战的过程,随着市场的起起伏伏,要抓住每一个机会,同时规避各种风险,这需要投资者具有敏锐的洞察力和快速的决策能力。不过现在有好消息,一款人工智能聊天机器人 FinChat.io 诞生了!它能帮助投资者分析市场,挖掘有潜力的股票,并提供买卖的实时建议 --------…

Java与数据库:JDBC和ORM框架的使用和效率优化

第一章&#xff1a;引言 随着互联网的快速发展和大数据时代的到来&#xff0c;数据库在软件开发中起到了至关重要的作用。Java作为一门强大而广泛应用的编程语言&#xff0c;提供了多种与数据库交互的方式。其中&#xff0c;JDBC和ORM框架是最常用的两种方式。本文将深入探讨J…

OpenWRT 实现Exsi8单个公网ip管理与访问

一台Dell R720机器 内存256G(64G*4)硬盘SSD 8T(1T*8)搭建了一个裸金属k8s集群(对比阿里云单台4核8G的费用不相上下) 机房上架提供了一个公网ip 需要一个公网ip能实现exsi虚拟机管理 又可以让虚拟机实现web访问 是终通过OpenWRT实现 OpenWRT实现步骤 1、官网访问并下载img镜…

Kotlin笔记(零)简介

百度百科简介 2017年&#xff0c;google公司在官网上宣布Kotlin成为Android的开发语言&#xff0c;使编码效率大增。Kotlin 语言由 JetBrains 公司推出&#xff0c;这是一个面向JVM的新语言 参考资料 官网&#xff1a;https://kotlinlang.org/中文官网&#xff1a;https://w…

C++ 遍历算法

&#x1f914;遍历算法&#xff1a; &#x1f642;1.for_each 遍历容器 &#x1f50d;介绍&#xff1a; 在C中&#xff0c;for_each是一个用于遍历容器元素并对它们进行操作的算法。它通常有三个参数&#xff1a; &#x1f4d6;1. 容器的起始位置&#xff08;iterator&am…

chatgpt赋能python:Python中调换数据位置的方法

Python中调换数据位置的方法 在Python编程中&#xff0c;我们经常需要操作数据的位置&#xff0c;例如调换数组中的元素顺序、交换多个变量的值等。在本篇文章中&#xff0c;我们将介绍Python中调换数据位置的常用方法&#xff0c;并给出相应的代码示例。 1.使用临时变量交换…

ShardingSphere笔记(三):自定义分片算法 — 按月分表·真·自动建表

ShardingSphere笔记&#xff08;二&#xff09;&#xff1a;自定义分片算法 — 按月分表真自动建表 文章目录 ShardingSphere笔记&#xff08;二&#xff09;&#xff1a;自定义分片算法 — 按月分表真自动建表一、 前言二、 Springboot 的动态数据库三、 实现我们自己的动态数…

chatgpt赋能python:Python中最大公约数计算

Python中最大公约数计算 在Python编程中&#xff0c;求最大公约数是一个非常常见的需求。最大公约数一般简称为gcd&#xff0c;其定义为两个或多个整数的最大公因数。 在本篇文章中&#xff0c;我们将介绍Python中最常用的两种计算gcd的方法&#xff0c;并深入讲解它们的实现…

使用Intel ARC 750 GPU或Intel CPU硬件在GIMP上运行stable diffussion插件进行AI绘图

安装步骤&#xff1a; 1. clone代码&#xff1a; git clone https://gitee.com/cslola/openvino-ai-plugins-gimp.git 或者直接到github上下载最新 git clone https://github.com/intel/openvino-ai-plugins-gimp.git2. 安装python以来库文件 :: run install script open…

LeetCode - 10 正则表达式匹配

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 10. 正则表达式匹配 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或…

SpringBoot框架理解

1 SpringBoot入门 1.2 什么是SpringBoot 1 官网的解释 ​ Spring在官方首页是这么说的&#xff1a;说使用SpringBoot可以构造任何东西&#xff0c;SpringBoot是构造所有基于Spring的应用程序的起点,SpringBoot在于通过最少的配置为你启动程序。 2 我的理解 SpringBoot是Sp…

损失函数——交叉熵损失(Cross-entropy loss)

交叉熵损失&#xff08;Cross-entropy loss&#xff09;是深度学习中常用的一种损失函数&#xff0c;通常用于分类问题。它衡量了模型预测结果与实际结果之间的差距&#xff0c;是优化模型参数的关键指标之一。以下是交叉熵损失的详细介绍。 假设我们有一个分类问题&#xff0…

基于深度学习的高精度山羊检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度山羊检测识别系统可用于日常生活中或野外来检测与定位山羊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的山羊目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

elementUI中<el-select>下拉框选项过多的页面优化方案——多列选择

效果展示(多列可以配置) 一、icon下拉框的多列选择&#xff1a; 二、常规、通用下拉框的多列选择&#xff1a; 【注】第二种常规、通用下拉框的多列选择&#xff0c;是在第一种的前端代码上删除几行代码就行&#xff08;把icon显示标签删去&#xff09;&#xff0c;所以下面着重…

陕西省养老服务人才培训基地申报条件范围、认定材料流程

今天为大家整理了陕西省养老服务人才培训基地申报条件范围、奖励措施等内容&#xff0c;感兴趣的朋友们可以了解一下&#xff01; 如果想要申报西安市、宝鸡市、铜川市、咸阳市、渭南市、延安市、汉中市、榆林市、安康市、商洛市的项目政策&#xff0c;详情见下图 目标任务 陕…

Games104现代游戏引擎学习笔记11

胶囊&#xff1a;两层。 内层&#xff1a;真正碰撞的层级 外层&#xff1a;类似保护膜&#xff0c;防止离别的东西太近&#xff0c;高速移动时卡进物体。另一个作用是防止过于贴近摄像机的进平面&#xff0c;看到墙背后的物体 朝墙移动时&#xff0c;实际往往并不是撞击&#…

Java程序设计入门教程-- switch选择语句

switch选择语句 情形 虽然if…else语句通过嵌套可以处理多分支的情况&#xff0c;但分支不宜太多&#xff0c;在Java语言中&#xff0c;提供了switch语句可以直接、高效地处理多分支选择的情况。 格式 switch &#xff08;表达式&#xff09; { case 常量表达式1&#x…

EclipseCDT远程交叉编译远程单步调试基于makefile例程(实测有效)

文章目录 前言&#xff1a;1. 新建工程2. 远程编译环境配置2.1 下载sshfs并挂载目录2.2 Debug配置2.3安装EclipseCDT的远程插件2.4 拷贝gdbserver 3. 调试总结: 前言&#xff1a; 之前写过一篇VSCode远程调试linux&#xff0c;当时是把程序以及代码通过远程的方式&#xff0c;…

pycharm内置Git操作失败的原因

文章目录 问题简介解决方案DNS缓存机制知识的自我理解 问题简介 最近在pycharm中进行代码改动递交的时候&#xff0c;总是出现了连接超时或者推送被rejected的情况&#xff0c;本以为是开了代理导致的&#xff0c;但是关闭后还是推送失败&#xff0c;于是上网查了以后&#xf…