首页 > 其他分享 >关于查询接口设计

关于查询接口设计

时间:2022-11-25 22:56:50浏览次数:33  
标签:10 GET 接口 order 设计 查询 page size

此篇博客记录自己在设计模糊查询接口时候犯的错误,以及个人的一些浅略的思考,再次说明此并非最优设计。

前言

此模糊查询是项目的一个小接口,大致功能如下图所示。

产品的需求:

  1. 下拉框可以筛选状态,如选中已激活,则只展示已激活状态的学生名单。
  2. 搜索框中可以输入内容,进行姓名模糊查询。
  3. 可以根据创建时间进行排序,升序或者降序。
  4. 分页功能

第一次的接口设计(❌)

不知道从哪篇博客中看到这样一句话:GET操作不修改数据库,POST操作修改数据库(事实没这么绝对)。这不简单呀,5秒钟,Controller,Service...,前端对接,搞定。

GET /student/{studentName}/{state}?order=1&page=1&size=10
GET /student/{state}?order=1&page=1&size=10

order: -1:不排序,0:升序,1:降序
state: -1:全部,0:未激活,1:已激活

哦,这该死的天才,这么难的问题,轻易化解。

让我们对应需求,一一验证:

  1. 下拉框可以筛选状态,如选中已激活,则只展示已激活状态的学生名单。
    GET /student/1?order=-1&page=1&size=10
  2. 搜索框中可以输入内容,进行姓名模糊查询。
    GET /student/张三/-1?order=1&page=1&size=10
  3. 可以根据创建时间进行排序,升序或者降序。
    GET /student/-1?order=1&page=1&size=10 升序
  4. 分页功能
    GET /student/-1?order=1&page=1&size=10

前端,我的接口都能满足,要什么你自己组合去,很显然,目前为止功能正常。

测试登场,毫不犹豫扔给你一个缺陷,大意了没有闪。

为什么会出现404呢?哦因为你查询的内容导致接口变了。

第二次的接口设计(✔)

  1. 为什么接口不能正常映射?
    因为特殊字符,浏览器没把它当成字符串,导致请求的接口不能被后端识别。
  2. 有什么感想?
    这种studentName未知的东西,尽量别放在PathParam,今天出来一个%,明天一个\,后天不知道出什么幺蛾子。
    像state,这种固定的东西,只能取-1,0,1,可以放进PathParam中。

苦思冥想,这GET操作,还能怎么设计呢?

POST优雅登场

POST /student/list
{
    "conditions":{
        "name":"huiu9123",
        "state":-1
    },
    "order":0,
    "page":1,
    "size":10
}

通用Request

设计通用搜索请求体,conditions放自定义搜索条件,order、page、size这三个参数每个搜索都会用到,放在外边。

@Setter  
@Getter  
public class QueryRequest<T> {  
	/**
	 * 自定义搜索条件
	 * /
    T conditions;  
    /**  
     * 排序  
     */  
    Integer order;  
    /**  
     * 第几页  
     */  
    Integer page;  
    /**  
     * 每页数据量  
     */  
    Integer size;  
}

设计需求自定义搜索条件

@Setter  
@Getter  
@NoArgsConstructor  
@AllArgsConstructor  
public class StudentQueryCondition {  
    String name;  
    Integer state;  
}

设计搜索接口

@PostMapping(path = "/list")  
public String list(@RequestBody QueryRequest<StudentQueryCondition> request) {  
    CodeMessageEnum msg = CodeMessageEnum.OK;  
    .......省略处理逻辑......
    return ControllerUtil.wrap(msg, response).toString();  
}

结尾

  1. 别人说的话不一定是对的。
  2. 踩过坑,才能长记性,这次因为我的错误,前端也要修改大量内容。

最最最后

  1. 希望得到您的建议,无论哪种方面。
  2. 希望得到您的纠错,让我知道自己错了,让别人知道我错了(纠错信息,纠错人-纠错时间将会展示在文末),万分感谢。

知错能改、善莫大焉

** 预留 **

标签:10,GET,接口,order,设计,查询,page,size
From: https://www.cnblogs.com/handsometaoa/p/16926613.html

相关文章