V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bxb100
V2EX  ›  Java

关于 swagger 的疑惑

  •  
  •   bxb100 · 2024-05-13 17:15:57 +08:00 · 3315 次点击
    这是一个创建于 472 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按理来说 openAPI 的 schema 应该先设计好, 然后生成 swagger ui, 但是现在 Java 用注解生成 openAPI 是不是本末倒置?

    19 条回复    2024-06-06 11:02:43 +08:00
    julyclyde
        1
    julyclyde  
       2024-05-13 17:20:51 +08:00   ❤️ 1
    1 这事其实和 java 没啥关系
    2 初版 API 规范用注解来生成其实也没什么不合适的,只要别改来改去就可以
    lolizeppelin
        2
    lolizeppelin  
       2024-05-13 17:36:17 +08:00   ❤️ 2
    这本质是一个工程问题
    方式 1: 设计人员设计好结构, 接口, 编写文档,由设计指导代码编写
    方式 2: 开发人员编写代码后,同步文档

    1 和 2 的本质区别,在于结构、接口、文档是开发人员负责还是专门的部门、人员负责

    如果根本不存在一个专门部门或者人员负责文档和结构设计,自然倾向于自动生成文档和结构

    注解生成只是自动生成的方式
    bxb100
        3
    bxb100  
    OP
       2024-05-13 17:44:27 +08:00
    @julyclyde @lolizeppelin 我不是说这个行为对或者错, 而是在于写 spec 的过程是一个思考的过程, 比如说如何分类, 如何复用, 如何验证. 直接用注解生成一个是有侵入性, 第二个 UI 也不美观, 第三个是写接口的时候突出一个随意, 没有文档, 没有思考过程.

    有没有专门 doc developer 来做和这个事情值不值得做是两个问题, 我主要是想问大家是怎么看待这个事情, 或者有啥其它的真知灼见
    julyclyde
        4
    julyclyde  
       2024-05-13 17:47:13 +08:00
    @bxb100 无法实现的理想,不能叫工程理想
    bxb100
        5
    bxb100  
    OP
       2024-05-13 17:48:34 +08:00
    @julyclyde #4 确实, 不过我在重新找回理想的过程中
    hoko1814
        6
    hoko1814  
       2024-05-13 17:49:58 +08:00
    我理解成那个 swagger 了,溜……
    lolizeppelin
        7
    lolizeppelin  
       2024-05-13 17:59:48 +08:00   ❤️ 1
    @bxb100
    你说的没错, spec 和接口的设置本身就是要适配需求、甚至要预留未来需求,本身就是需要比一般代码人员更熟悉的人来编写的

    但是实际项目中,根本没人、或者根本没时间干这个事, 大部分时间都再怼业务代码、需求还改来改去导致接口与结构都一直在变化

    这种情况下还把文档、结构和代码分开,那么反而会成为累赘,还不如写什么代码就生成什么文档和结构


    这种反向自动生成行为本身就是为了适应环境的结果,是结果,不是目的

    你要知道更差劲的结果是: 设计的文档、结构、接口和代码根本对不上、因为根本没人管
    iyiluo
        8
    iyiluo  
       2024-05-13 18:02:35 +08:00   ❤️ 1
    开发过程中接口变动很常见,按部就班开发是非常理想化的设想,在现实中几乎不可能
    bxb100
        9
    bxb100  
    OP
       2024-05-13 18:21:04 +08:00
    @lolizeppelin #7 多谢回复
    leegradyllljjjj
        10
    leegradyllljjjj  
       2024-05-13 18:47:45 +08:00
    年轻人还在这儿研究茴字儿的写法,部门领导 pm 只会关心什么时候能上线
    siteshen
        11
    siteshen  
       2024-05-13 19:02:46 +08:00
    如果 spec 能方便地增量生成后端代码框架,先定义 spec 也不会造成额外的负担。而实际上,先设计 schama ,后端要做的是按照设计的 schema 重新用代码实现一遍 input, output, validation ,增加无谓的重复工作。

    所以我选择倾向于用第二种方式,对增量的 API 开发更友好。

    利益相关:后端开发。
    julyclyde
        12
    julyclyde  
       2024-05-13 19:42:30 +08:00
    @siteshen spec 可以生成后段代码框架啊。很容易的
    openapi generator
    susuper
        13
    susuper  
       2024-05-14 00:52:16 +08:00
    swagger-codegen 可以生成 ts 、java 等前后端代码,前后端都可以写 SPEL ,然后利用工具生成各自接口层,前端实现调用方法,后端实现继承接口。
    chuck1in
        14
    chuck1in  
       2024-05-14 08:32:22 +08:00
    先做 spec 再实现这种方式也不是不行,不过有个问题,就是他对整体效率和工程质量的把控上是否有更大的提升。
    有的话,我觉得就可以搞,如果没有的话,就不一定要搞。
    大家怎么看呢。
    bxb100
        15
    bxb100  
    OP
       2024-05-14 11:09:57 +08:00
    @chuck1in 类比于 apache 之类的项目都是先写 RFC 然后再开发的流程非常好, 但是我实际去做就挺不好的, 没啥配合度, 感觉就自己一个人玩
    julyclyde
        16
    julyclyde  
       2024-05-14 13:14:45 +08:00
    @bxb100 apache 这个例子恐怕不正确吧
    houzhiqiang
        17
    houzhiqiang  
       2024-05-14 16:26:57 +08:00
    FastAPI 先写接口定义(方法签名)然后就可以生成 openapi 了,部署到测试环境,接下来补充实现
    @router.get("/users", name="get user")
    def get_user(id: int) -> User:
    # TODO: do something ...
    return User(name="u", )
    siteshen
        18
    siteshen  
       2024-05-15 09:08:40 +08:00
    @julyclyde 主要是对「增量」不友好。
    smartdoc647
        19
    smartdoc647  
       2024-06-06 11:02:43 +08:00
    线设计 API 文档和工具并不冲突,比如我最近的开发方式:
    1 、分析需求文档
    2 、用自己开发的 SpringBoot 脚手架创建一个空的 SpringBoot 项目用于建模 API 接口
    3 、思考需求,在 2 步骤创建的 API 建模项目中定义空结构体和空 Controller 接口
    4 、用 smart-doc 扫描定义的空接口生成 API 文档
    5 、用生成的 API 文档和前端和产品人员完成定稿和微调。
    6 、启动正式项目开发,完全复制一些前面编写空接口的结构体。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3448 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:27 · PVG 18:27 · LAX 03:27 · JFK 06:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.