美文网首页
如何设计优雅的符合restful风格的API

如何设计优雅的符合restful风格的API

作者: 逆水清寒 | 来源:发表于2020-04-16 19:58 被阅读0次

    一:RESTful是什么

    • 1:RESTful是一种架构风格,是一种描述语言,不是一个标准
    • 2:RESTful核心就是rest,rest是几个单词的缩写(REpresentational State Transfer),各种国人写的文档都是直译为:表现层状态转移。这对一些刚接触的人来说都是一脸懵,和我们刚接触Spring的IOC(控制反转)一样,理解了好长时间才明白其中意思。很多软件的一些专业词汇都缺乏主语和宾语,增加了理解的难度。rest的主语就是各种Resource(文档,音乐,视频)。具体真正完整的描述应该是:资源在网络请求中以某种的表现形式把状态进行了改变
    • 3:资源在网络上有特定的实体,互联网有一个统一资源定位符(URI)来指向它
    • 4:REST使用的是HTTP,URI,XML等已有的协议和标准

    二:为什么要使用RESTful架构风格的接口

    • 统一请求风格,用于各种前端的访问
    • Restful的API是面向资源的,非常清晰,根据url就知道内容
    • 轻量,直接基于http

    三:设计RESTful接口的规范

    • 在介绍原则之前,先说几个概念
    概念 含义
    幂等性 一个操作或者多个操作导致资源的结果是一样的
    RFC Internet服务的标准,通常标准文件由数字标识,数字越大,代表标准越新
    URI 表示资源,资源对应的是服务器端领域模型的实体类
    Endpoint 路径,表示api的具体网址
    • 我们在设计符合restful规则API时候要知道我们一个api是对资源的操作,这是个前提。所以我们重要考虑的点在URI的Endpoint请求方式入参返回结果异常这几个方面来考虑
    1:URI规范
    • (1)不用大写
    @GetMapping("/api/app/Order") //Order大写字母开头,错误
    @GetMapping("/api/app/orders") //正确
    
    • (2)URI使用复数形式
    @GetMapping("/api/app/order") //order不是复数,错误 
    @GetMapping("/api/app/orders") //正确
    
    • (3)使用-不要用_
    @GetMapping("/api/app/order_type/1") //错误
    @GetMapping("/api/app/order-type/1") //正确
    
    • (4)避免层级过深的URI,过深导航会导致URI膨胀,不易维护
     @GetMapping("/api/app/orders/1/good-type/1") //错误
     @RequestMapping("/api/app/orders"){
     @RequestParam(value = "goodType") Integer goodsType} //正确
     
    
    2:Request规范
    • HTTP有五种方法对URI进行CURD操作,每个的幂等性都不一样,可以按照下面规范定义不同的操作
    方法 含义 幂等性 DEMO
    GET 查询 /api/orders
    POST 新增 /api/orders
    PUT 修改完整资源 /api/orders/1
    PATCH 修改部分属性 /api/orders/1
    DELETE 删除资源 /api/orders/1
    3:response规范
    • (1)只返回数据,不包装,我们的一个具体的测试工程项目返回的接口,只有返回数据
    {
      "id": "1246021398806081538",
      "projectName": "沈磊的项目",
      "companyId": "1246020467318276097",
      "companyName": "沈磊的企业",
      "address": "北京第二小学",
      "type": 3,
      "firstPartName": "我不太清楚甲方是谁",
      "secondPartName": null,
      "contractAmount": 222558,
      "deviceCategory": 5,
      "deviceBrand": "北京",
      "deviceAmount": 333586,
      "upstreamSupplierType": 3,
      "upstreamSupplierName": "上游供应商的东西",
      "createBy": "艾新建",
      "updateTime": "2020-04-03 18:27:20",
      "updateBy": "艾新建"
    }
    
    • (2)各HTTP方法成功处理后的数据格式
    方法 返回格式
    GET 查询的对象
    POST 新增成功的对象
    PUT 更新成功的对象
    PATCH 更新成功的对象
    DELETE
    4:错误码规范
    • 业务类异常controller层做统一拦截,统一错误码500
    • 使用http自带的状态码,不许自定义
    5:完整的demo

    根据我们已有的项目,包含完整的CURD的操作,展示出来供参考

        @ApiOperation(value = "查询工程项目详情",notes = "查询工程项目详情",httpMethod = "GET")
        @GetMapping("/{id}")
        public Project detail(@PathVariable("id") Long id) {
            return projectService.detail(id);
        }
    
        @ApiOperation(value = "添加工程项目",notes = "添加工程项目",httpMethod = "POST")
        @PostMapping
        public Project add(@RequestBody@Valid ReqProject req) {
            return projectService.add(req);
        }
    
        @ApiOperation(value = "修改项目工程", notes = "修改工程项目", httpMethod = "PUT")
        @PutMapping
        public Project update(@RequestBody @Valid ReqProject req) {
            return projectService.update(req);
        }
        
        @ApiOperation(value = "查询工程项目列表(分页)",notes = "查询工程项目列表(分页)",httpMethod = "GET")
        @GetMapping(value = "/page")
        public IPage<RespProject> page(ReqProjectQuery req) {
            return projectService.page(req);
        }
        
        @ApiOperation(value = "删除工程项目",notes = "删除工程项目",httpMethod = "DELETE")
        @DeleteMapping("/{id}")
        public void delete(@PathVariable("id") Long id) {
            log.info("查询工程信息详情入参:{}",id);
            projectService.delete(id);
        }
    

    相关文章

      网友评论

          本文标题:如何设计优雅的符合restful风格的API

          本文链接:https://www.haomeiwen.com/subject/svndvhtx.html