首页 > 其他分享 >rest风格——fetch发送请求

rest风格——fetch发送请求

时间:2023-08-09 20:56:24浏览次数:27  
标签:status const res req rest id 发送 data fetch

 

服务器端代码

有index.js和package.json

 

  • 文件名index.js
const express = require("express")
const jwt = require("jsonwebtoken")

const app = express()

let STU_ARR = [
    { id: "1", name: "孙悟空", age: 18, gender: "男", address: "花果山" },
    { id: "2", name: "猪八戒", age: 28, gender: "男", address: "高老庄" },
    { id: "3", name: "沙和尚", age: 38, gender: "男", address: "流沙河" },
]

/********************中间件***********************************/
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use((req, res, next) => {
    res.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
    res.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,PATCH");
    res.setHeader("Access-Control-Allow-Headers", "Content-type,Authorization");
    next();
})



/********************路由***********************************/

// 登录路由
app.post("/login", (req, res) => {
    const { username, password } = req.body;
    if (username == "admin" && password == "123") {
        // 生成token
        const token = jwt.sign({ id: "12345", username: "admin", nickname: "超级管理员" }, "chaojianquanmima", { expiresIn: "1d" })

        res.send({
            status: "ok",
            data: {
                token,
                nickname: "超级管理员"
            }
        })
    } else {
        res.status(403)
        res.send({
            status: "error",
            data: "用户名或密码错误"
        })
    }
})

// 获取学生信息的路由
app.get("/students", (req, res) => {
    console.log("收到students的get请求");

    try {
        // 获取、解码token
        const token = req.get("Authorization").split(" ")[1];
        const decodeToken = jwt.verify(token, "chaojianquanmima")
        res.send({ status: "ok", data: STU_ARR });
    } catch (e) {
        console.log("解码错误,token无效");
        res.status(403).send({ status: "error", data: "数据无效" })
    }
})

// 查询某个学生的信息
app.get("/students/:id", (req, res) => {
    const id = req.params.id;
    const stu = STU_ARR.find((item) => { return item.id === id });
    if (stu) {
        res.send({ status: "ok", data: stu })
    } else {
        res.status(403);
        res.send({ status: "failed" })
    }
})

// 添加学生信息的路由
app.post("/students", (req, res) => {
    console.log("收到students的post请求", req.body);
    const { name, age, gender, address } = req.body;
    const stu = {
        id: +STU_ARR.at(-1).id + 1 + "",
        name: name,
        age: +age,
        gender: gender,
        address: address
    };

    // 获取学生信息
    STU_ARR.push(stu);

    res.send({
        status: "ok",
        data: stu
    });
})


// 删除学生的路由
app.delete("/students/:id", (req, res) => {
    console.log("向/students发送delete请求");
    const id = req.params.id;

    for (let i = 0; i < STU_ARR.length; i++) {
        if (STU_ARR[i].id === id) {
            const delStu = STU_ARR[i]
            STU_ARR.splice(i, 1);

            res.send({ status: "ok", data: delStu });
            return
        }
    }

    res.status(403);
    res.send({ status: "error", data: "学生id不存在" });
})


// 修改学生信息
app.put("/students", (req, res) => {
    console.log("向/students发送put请求");
    const { id, name, age, gender, address } = req.body;
    const editStu = STU_ARR.find((item) => { return item.id === id })

    if (editStu) {
        editStu.name = name;
        editStu.age = age;
        editStu.gender = gender;
        editStu.address = address;

        res.send({ status: "ok", data: editStu })
    } else {
        res.status(403)
        res.send({ status: "error", data: "学生不存在" })
    }

})


// 
app.get("/test", (req, res) => {
    console.log("收到发送给/test的get请求");
    
})


app.listen(3000, () => {
    console.log("服务器启动");
})
  • package.json

{
  "name": "my-server",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "express": "^4.18.2",
    "jsonwebtoken": "^9.0.1"
  }
}

 

客户端代码

  •  login.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table {
            border-collapse: collapse;
            width: 50%;
        }

        tr,
        td {
            font-size: 20px;
            text-align: center;
            border: 1px solid black;
        }

        caption {
            font-size: 30px;
            font-weight: bold;
        }
    </style>
</head>

<body>
    <div id="login">
        <h1>请登录后再操作</h1>
        <h2 id="info"></h2>
        <form>
            <div>
                <input type="text" id="username">
            </div>
            <div>
                <input type="password" id="password">
            </div>
            <div>
                <input type="button" id="login-btn" value="登录">
            </div>
        </form>
    </div>


    <div id="list"></div>


    <script>
        const login = document.querySelector("#login");
        const info = document.querySelector("#info");
        const login_btn = document.querySelector("#login-btn");
        const username = document.querySelector("#username");
        const password = document.querySelector("#password");


        if (localStorage.getItem("token")) {
            login.innerHTML = `
                            <h1>欢迎超级管理员回来</h1>
                            <hr>
                            <button id="load-btn">加载数据</button>
                            <button id="out-btn">注销</button>
                            `;
        } else {
            login_btn.addEventListener("click", () => {

                fetch("http://localhost:3000/login", {
                    method: "post",
                    headers: {
                        "Content-type": "application/json"
                    },
                    body: JSON.stringify({
                        username: username.value.trim(),
                        password: password.value.trim()
                    })
                })
                    .then(res => res.json())
                    .then(res => {
                        console.log(res);
                        if (res.status == "ok") {
                            info.innerText = "登录成功";
                            login.innerHTML = `
                            <h1>欢迎${res.data.nickname}回来</h1>
                            <hr>
                            <button id="load-btn">加载数据</button>
                            <button id="out-btn">注销</button>
                            `;

                            localStorage.setItem("token", res.data.token)
                            localStorage.setItem("nickname", res.data.nickname)
                        } else {
                            info.innerText = "用户名或密码错误";
                        }
                    })
                    .catch(err => {
                        console.log("代码运行出错了");
                    })
            })
        }

        const loadBtn = document.querySelector("#load-btn");

        loadBtn.onclick = function () {
            // 读取学生信息
            fetch("http://localhost:3000/students", {
                headers: {
                    "Authorization": `Bearer ${localStorage.getItem("token")}`
                }
            })
                .then(res => {
                    return res.json()
                })
                .then(res => {
                    if (res.status === "ok") {
                        console.log(res);
                        const table = document.createElement("table");
                        list.appendChild(table);
                        table.insertAdjacentHTML("beforeend", "<caption>学生列表</caption>");

                        for (let item of res.data) {

                            const tr = document.createElement("tr");

                            for (let probname in item) {
                                const td = document.createElement("td");
                                td.innerText = `${item[probname]}`;
                                tr.appendChild(td);
                            }

                            table.appendChild(tr);
                        }
                    }
                })
                .catch(err => {
                    console.log("出错了");
                })

        }


        // fetch("http://localhost:3000/students", {
        //     method: "post",
        //     headers: {
        //         "Content-type": "application/json"
        //     },
        //     body: JSON.stringify({
        //         name: "min",
        //         age: "18",
        //         gender: "女",
        //         address: "bupt"
        //     })
        // })
        //     .then(res => res.json())
        //     .then(res => console.log(res))
        //     .catch(err => console.log(err))




    </script>
</body>

</html>
  • index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="btn">点我加载数据</button>
    <button id="btn2">点我加载数据2</button>
    <div id="root">

    </div>
</body>

<script>
    const btn = document.querySelector("#btn");
    const btn2 = document.querySelector("#btn2");
    const root = document.querySelector("#root");

    btn.addEventListener("click", () => {

        fetch("http://localhost:3000/students")
            .then(res => {
                if (res.status === 200) {
                    // 获取数据
                    return res.json()
                } else {
                    throw new Error("加载失败!")
                }
            })
            .then(res => {

                if (res.status === "ok") {
                    const table = document.createElement("table");
                    root.appendChild(table);

                    for (let item of res.data) {
                        const tr = document.createElement("tr");

                        for (let probname in item) {
                            const td = document.createElement("td");
                            td.innerText = `${item[probname]}`;
                            tr.appendChild(td);
                        }

                        table.appendChild(tr);
                    }
                }
            })
            .catch(err => {
                console.log("出错了");
            })
    })

    btn2.onclick = function(){
        
            fetch("http://localhost:3000/students/1", {
                method:"delete",
                headers:{
                    "Content-type":"application/json"
                },
                body:JSON.stringify({

                })
            })
        }

</script>

</html>

 

标签:status,const,res,req,rest,id,发送,data,fetch
From: https://www.cnblogs.com/minmin1009/p/17617971.html

相关文章

  • Django REST framework
    简介在Django框架基础之上,进行二次开发用于构建RestfulAPI简称为DRF框架或RESTframework 特性提供了强大的Serialize序列化器,可以高效进行序列化与反序列化操作提供了极为丰富的类视图、Mixin扩张类、ViewSet视图集提供了直观的We......
  • Restful 的简单应用
    Restful是一种开发理念,是一种设计风格而不是标准,是ReprentationalStateTransfer的缩写,全称为具象状态传输每个URL代表一种资源json格式数据text文本图片、视频等客户端和服务器之间,传递这种资源的某种表现形式通过请求头中Content-Type来指明传给......
  • SQL中fetch_array()和fetch_row()的区别
    相同点:两个的作用都是把查询结果的第一行返回到一个数组中。不同点:fetch_row()是通过数字索引取值。$res=mysqli_query($con,$sql);//返回资源$arr=mysqli_fetch_row($res);//查询的第一行结果赋值给$arrprint_r($arr);print_r($arr[0]);fetch_arroc()是通过关键字......
  • 数据仓库(十二)---分布式SQL查询引擎---teradata版本的presto安装和使用
    我们在使用presto过程中,发现facebook原版和京东原版都是解压可用,teradata版本的安装要麻烦一些。下面对teradata版本的安装过程进行记录。首要条件1、需要python2.6或者python2.7环境之所以需要python环境是因为teradata版本的presto把安装封装成了集群式安装。根据配置在安装过......
  • 11REST表述性状态转移
    REST是一种通常使用HTTP和XML进行基于WEB通信的技术,可以降低开发的复杂性,提高系统的可伸缩性以往的每一个命令对应一个接口,命令数量多导致接口爆炸,现在通过REST技术将不同的命令都可以通过相同的接口实现相应的功能。 REST的5个原则:网络上所有的事物都应该抽象为资源每个资......
  • C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章
    今天继续研究C#的WinForm的实例显示效果。我们上次介绍了Winform窗体的唯一实例运行代码(见博文:基于C#的应用程序单例唯一运行的完美解决方案-开源研究系列文章 )。这就有一个问题,程序已经打开了,这时候再次运行该应用程序,我们的方案是将该应用的主窗体显示出来。这个在......
  • udp发送上位机(1)
    发送彩色视频RGB888时,在上位机,通过BGR2BGR565转换为16位数据,再传输时加上行号,在DMA里也要对读出的数据进行高低位的变换,组成RGB565格式如下图所示,在灰度图时将每帧刷新改为了每一行刷新,这是因为在彩色图像时,刷新一帧的时间大于2ms,而灰度时为0.7ms,这就会导致在刷新的时候,新的数据......
  • RESTful 接口
    本文我们来谈谈,关于REST接口。什么是RESTful接口REST->RespresentationalStateTransfer(表述性状态转移)REST将资源的状态以适合客户端的形式从服务端发送到客户端(或相反方向)。在REST中,通过URL进行资源定位,用HTTP动作(GET、POST、DELETE、PUT等)描述进行操作,完成功能。R......
  • 前端学习笔记202306学习笔记第三十八天-Es6-rest运算符3
        ......
  • 如何在轻量级RTSP服务支持H.264扩展SEI发送接收自定义数据?
    为什么开发轻量级RTSP服务?开发轻量级RTSP服务的目的是为了解决在某些场景下用户或开发者需要单独部署RTSP或RTMP服务的问题。这种服务的优势主要有以下几点:便利性:通过轻量级RTSP服务,用户无需配置单独的服务器,降低了部署和配置的复杂性(无论是走RTMP还是GB28181,均需要平台服务支撑)。......