SSMP整合案例(9) 统一表现层数据返回格式

news2024/11/15 4:23:37

上文 SSMP整合案例(8) Restful开发表现层接口 我们就已经是把表现层的接口写完了
但是 我们会发现 现在前端人员拿到我们的数据 格式看着非常的乱
我们 数据库 添加 修改 删除 就是但数据的格式 一个 布尔值
查询 就是 查多个 一个集合
查询 全部 则就是 一个对象的格式
还有分页的一个 IPage的一个单对象的格式
五花八门

不同数据 解析方式是不一样的 前端同事看着就会非常崩溃了

那么 我们可以统一一下 例如 我们返回的数据 都可以放在 data的字段中
但是 这样 我们查询错误 或者没查到时 就会出现 null的情况

那么 我们就会给前端一个这样的东西

{
    data: null
}

这个是很有争议的 因为 这个null 也不一定是没有数据 也可能是系统异常导致的 还有一些外界因素

所以 只有一个data 显然不太够 我们前端同事显然不知道怎么去提示用户 是数据异常啊 还是怎么了
我们加个 state 如果是 200 表示成功了

{
    data: {
        state: 200,
        name: 数据
    }
}

失败则是

{
    data: {
        state: 500,
        name: null
    }
}

具体的 大家可以去了解一下 HTTP状态码
但是 后台我们运行过程中 也可能出现各种各样问题
这个 我们还需要给个输出语句
message
例如

{
    data: {
        state: 200,
        name: 数据,
        message: "操作成功"
    }
}

或者

{
    data: {
        state: 500,
        name: null,
        message: "系统异常"
    }
}

在我们项目之前的 controller 包下创建一个包 叫 utils
utils包下创建一个 ResultUtil 类
在这里插入图片描述
ResultUtil 参考代码如下

package com.example.webdom.controller.utils;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class ResultUtil {
    private int state;
    private Object data;
    private String message;
}

相信大家还记得lombok的Data 自动声明 get和set方法
不然 这里 你还是要自己写get和set函数的
然后 我们通过AllArgsConstructor 给他加上了一个全部参数的构造方法 之前这个我们也讲过

那么 这个类 显然是为 BookController 的请求服务的 那显然 BookController 要改了
先将 getAll 查询全部函数代码更改成这样

@GetMapping
public ResultUtil getAll() {
    List<book> BookList = IBookService.list();
    int state = BookList.isEmpty()?500:200;
    String message = BookList.isEmpty()?"未获取到对应记录":"操作成功";
    ResultUtil ResultUtil = new ResultUtil(state,BookList,message);
    return ResultUtil;
}

首先 方法的返回值 我们返回一个ResultUtil对象类型的值
然后 我们定义BookList接收IBookService.list();获取的List集合
然后 用三元运算符给 state 和 message 赋值 BookList.isEmpty() 是在判断 List集合有没有拿到
然后 最后 通过构造方法 将我们处理好的三个字段注入到ResultUtil对象中并返回
我们到Postman中测试一下
在这里插入图片描述
在这里插入图片描述
非常完美

save 添加代码修改如下

@PostMapping
public ResultUtil save(@RequestBody book book){
    boolean verify = IBookService.save(book);
    int state = verify?200:500;
    String message = verify?"操作成功":"系统异常";
    ResultUtil ResultUtil = new ResultUtil(state,book,message);
    return ResultUtil;
}

因为 他添加的方法本来返回的就是 boolean 我们直接用它来判断有没有成功 因为他没有数据 所以 data我们直接把他加的这条数据还给他
Postman运行结果如下
在这里插入图片描述
我们看到数据库
我们的数据也是成功加进去了
在这里插入图片描述
修改自然就是改成这样

@PutMapping
public ResultUtil pudata(@RequestBody book book){
    boolean verify = IBookService.updateById(book);
    int state = verify?200:500;
    String message = verify?"操作成功":"系统异常";
    ResultUtil ResultUtil = new ResultUtil(state,book,message);
    return ResultUtil;
}

Postman运行结果如下
在这里插入图片描述
我们看到数据库
在这里插入图片描述
数据依旧修改成功
然后删除 这次我们来删一条不存在的数据
我们先把 方法改了

@DeleteMapping("{id}")
public ResultUtil delete(@PathVariable Integer id){
    boolean verify = IBookService.removeById(id);
    int state = verify?200:500;
    String message = verify?"操作成功":"系统异常";
    ResultUtil ResultUtil = new ResultUtil(state,null,message);
    return ResultUtil;
}

还是 用布尔接 然后判断操作有没有成功 不过 删除并不涉及任何数据 所以 我们直接给 null
Postman 我们给个不存在的 id 15吧
运行结果如下
在这里插入图片描述
可以看到 我们的返回值处理 也没有什么问题

根据id查询 单个数据 我们这样写

@GetMapping("{id}")
public ResultUtil getById(@PathVariable Integer id){
    book book = IBookService.getById(id);
    int state = book != null?200:500;
    String message = book != null?"操作成功":"系统异常";
    ResultUtil ResultUtil = new ResultUtil(state,book,message);
    return ResultUtil;
}

运行结果如下
在这里插入图片描述
然后是分页的查询方式

@GetMapping("/page")
public ResultUtil getPage(@RequestParam int page,int pageSize) {
    IPage<book> BookPage = IBookService.getPage(page, pageSize);
    int state = BookPage != null?200:500;
    String message = BookPage != null?"操作成功":"系统异常";
    ResultUtil ResultUtil = new ResultUtil(state,BookPage,message);
    return ResultUtil;
}

本身思路都是一样的
Postman 运行代码如下
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Linux 学习记录41(C++篇)

Linux 学习记录41(C篇) 本文目录 Linux 学习记录41(C篇)一、C中的引用1. 引用的定义2. 引用的注意事项3. 引用的基本使用4. 引用作为函数的入口参数5. 引用作为函数的返回值6. 常引用7. 结构体引用8. 指针和引用的区别 二、C中的动态内存分配1. new关键字(1. 申请单个类型的空间…

AI建模工具对比:如何选择适合你的工具套件

在人工智能&#xff08;AI&#xff09;的浪潮下&#xff0c;越来越多的企业和科研机构开始应用AI技术进行建模和分析。然而&#xff0c;选择哪种AI建模工具套件一直是一个让人挠头的问题。市面上存在着众多的AI建模工具&#xff0c;它们各有特点和优势&#xff0c;但如何找到适…

SpringBoot启动失败,也不报错

1&#xff09;将启动类添加try-catch捕获信息 在springboot的启动类中添加try-catch即可出现具体错误信息&#xff1b; try {SpringApplication.run(ConverterApplication.class, args);} catch (Exception e) {System.out.println("e.getMessage() " e.getMessage…

海运费查询:了解国际海运费的方法与注意事项

国际贸易中&#xff0c;海运是一种常见的货物运输方式。而对于企业或个人来说&#xff0c;了解和查询国际海运费是非常重要的。本文将介绍一些查询国际海运费的方法和注意事项&#xff0c;帮助您更好地掌握海运费用信息。 一、国际海运费的计算方法 FCL&#xff08;整箱&#…

祖冲之算法

祖冲之算法 1.题目描述 π 3.1415926~3.1415927之间 4/1-4/34/5-4/74/9-4/114/13.......... 通过关系,来计算 运算多少次之后,才会得到3.1415926~3.1415927之间2.代码 public class Main2 {public static void main(String[] args) {double ltargetPi3.1415926;double rtarg…

两两交换链表中的节点(LeetCode 24)

题目 24. 两两交换链表中的节点 思路 最开始自己画&#xff0c;越画越复杂比较复杂&#xff0c;写不出来&#xff01;&#xff08;呜呜&#xff09;去看了解题思路&#xff0c;发现只需要三步。&#xff0c;按以下思路写了代码&#xff0c;循环停止那里的条件我还以有更好的写…

android逆向开发之Frida逆向基础

Frida是一款功能强大的动态分析和逆向工程工具&#xff0c;可用于在运行时修改和监控应用程序。它支持多个平台&#xff0c;包括Android、iOS、Windows、macOS等&#xff0c;提供了JavaScript API&#xff0c;使用户能够在目标应用程序中直接执行自定义的脚本代码。 基础知识 …

CSS_高度自动过渡 auto height

方法一 grid 布局中的 fr 单位&#xff08;推荐使用&#xff09; <div class"wrap"><button class"trigger">鼠标放上来试试</button><div class"grid"><div><p>高度自动过渡</p></div></d…

leedcode-只出现一次的数字-异或

题目 题目 代码 class Solution { public:int singleNumber(vector<int>& nums) {int ansnums[0];for(int i1;i<nums.size();i){ansans^nums[i];}return ans;} };

【力扣】144、二叉树的前序遍历

力扣、144 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 // 递归遍历 var preorderTraversal function(root){let arr [];var fun &#xff08;node&#xff09;>{if(node){//先根节点&#xff1a;arr.push(node.val);fun(node.left);//遍历左子树…

IT必备的技能,看看你掌握了吗?

目录 架构知识技术与业务场景的结合数据库知识操作系统知识网络知识存储知识云计算知识编程语言知识软件产品知识硬件知识信息安全知识IT前沿技术知识。 今天在看一本书叫做《一本书讲透售前》&#xff0c;这本书分为了两部分&#xff1a; 第一部分描述了售前的工作篇&#xff…

Python图像高光调整

看了这个文章&#xff0c;里面有专门的c的实现&#xff0c;我这边简单的使用python进行了实现&#xff0c;实现了两个版本&#xff0c;一个是python遍历像素&#xff0c;一个是使用numpy加速&#xff0c;代码如下&#xff1a; import time import numpy as np import cv2def l…

软考高级系统架构设计师(六) 企业应用集成电子商务

目录 企业应用集成(重点) 电子商务 企业应用集成(重点) ps: 数据集成&#xff0c;比如 数据中间件 业务流程集成&#xff1a;过程集成&#xff0c;B2B--企业之间 企业门户&#xff1a; ps: 重构需求 电子商务

在教育领域中使用ChatGPT有哪些优点?

人工智能在教育领域的应用正在迅速增加。OpenAI于2022年11月开发的聊天机器人ChatGPT在全球范围内广受欢迎。 由于其受欢迎程度以及生成类似人类问题的回答的能力&#xff0c;ChatGPT正在成为许多学习者和教育工作者值得信赖的伴侣。然而&#xff0c;与任何新兴技术一样&#x…

机器学习——Word2Vec

参考资料&#xff1a; https://zhuanlan.zhihu.com/p/114538417https://www.cnblogs.com/pinard/p/7243513.html 1 背景知识 1.1 统计语言模型 统计语言模型是基于语料库构建的概率模型&#xff0c;用来计算一个词串 W ( w 1 , w 2 , ⋯ , w T ) W(w_1,w_2,\cdots,w_T) W…

计网实验第二章:TCP与UDP实验

TCP 1.服务器绑定端口号启动服务器欢迎socket。 2. 等待客户端发送请求。 3.等到客户端发送请求之后&#xff0c;服务器与客户端重新建立一个socket&#xff0c;但是客户端的目标端口不变。 java代码如下 客户端 客户端代码图解 import java.io.*; import java.net.*; clas…

《JavaScript 权威指南》犀牛书阅读详解

前言&#xff1a; 《JavaScript 权威指南》&#xff08;JavaScript&#xff1a;The Definitive Guide&#xff09;是一本由David Flanagan所著的JavaScript领域的经典书籍&#xff0c;它是学习和开发JavaScript应用不可或缺的参考书之一。该书分为两个部分&#xff0c;第一部分…

C语言程序在内存中是怎样布局的

理论 我们假设在32位Linux下进行编程&#xff0c;首先要明确&#xff0c;我们的虚拟地址空间有4G&#xff0c;4G的地址空间的寻址范围就是 0x0000_0000 ~ 0xFFFF_FFFF&#xff0c;在Linux下&#xff0c;高地址的1G内存是给操作系统使用的&#xff0c;也就是 0xC000_0000 ~ 0xF…

复习javascript第1章

JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 很容易学习。 JavaScript 能够改变 HTML 内容 getElementById() 是多个 JavaScript HTML 方法之一。 本例使用该方法来“查找” id"demo" 的 HTML 元素&#xff0c;并把元素…

深入浅出设计模式 - 迭代器模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…