到底要不要统一管理 API - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
不要在回答技术问题时复制粘贴 AI 生成的内容
tlerbao
V2EX    程序员

到底要不要统一管理 API

  •  1
     
  •   tlerbao 2024-01-17 17:42:41 +08:00 3909 次点击
    这是一个创建于 633 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的前后端分离项目,诸如前端 VUE 项目大家都好像喜欢统一管理 API

    之前和一个码农聊过,他认为完全没必要,又不是不去看页面

    所以:

    你是直接 http.get(后端 URL) ,还是 import 进来 await getUserList....

    所以:

    统一管理 API 的好处到底是啥?是不是反倒麻烦了

    直接在页面直接写 URL 请求后端不好吗?

    24 条回复    2024-01-18 23:53:14 +08:00
    liuhuansir
        1
    liuhuansir  
       2024-01-17 17:45:09 +08:00
    有没有可能一个 URL 在多个页面使用呢?
    lx271896700133
        2
    lx271896700133  
       2024-01-17 18:00:36 +08:00
    我觉得没必要。
    markgor
        3
    markgor  
       2024-01-17 18:04:43 +08:00
    之前仅仅封装请求函数,不封装接口 URI ;
    现在,把接口 URI 封装为方法。

    好处:
    复用的页面调用方便了,接口涉及修改的时候不用搜索来搜索去了;

    坏处:
    好像没啥坏处。

    实际:
    看项目规模和规定
    markgor
        4
    markgor  
       2024-01-17 18:08:58 +08:00
    对了,最重要一点,IDE 可以推导参数,特别是 ts 下

    你如果都用 http.get(xxxxx),参数 ide 无法推导,但 IDE 的推导并不直接影响代码的执行,对于小型的项目,意义不大,来来去去几个参数,但对于大型的项目,我觉得这个还是挺好的。
    rabbbit
        5
    rabbbit  
       2024-01-17 18:10:31 +08:00
    后端不变就第一种,后端改来改去就第二种,项目规模大第二种。
    举个例子,有个接口返回 {id:xxx},突然有一天变成了 {fooId: xxx},然后有十几个地方依赖这个接口。
    molvqingtai
        6
    molvqingtai  
       2024-01-17 18:21:04 +08:00
    假如前端同学 A 在 A 页面已经写过一遍 getUserInfo, 另个一前端 B 在需要在 B 页面也需要调用这个接口,难道还 要翻一遍 API 文档或问后端哪个接口是获取用户信息
    nulIptr
        7
    nulIptr  
       2024-01-17 18:34:19 +08:00
    当然可以,sql 写在 controller 里也可以啊
    自己项目爱咋搞咋搞,多人合作的项目按照领导说的来,自己负责的话掂量掂量会不会不好意思给人看自己的代码
    rossroma
        8
    rossroma  
       2024-01-17 19:10:17 +08:00
    统一管理好处很多:
    1. 可以把 get 或 post 封装起来,这样就不用担心在调用端写错了;
    2. 部分接口可能需要自定义 header 或者公共参数,你可以直接写在封装的方法里,避免每次调用的时候单独再传;
    3. 如果接口的 url 发生变更,你只需要改一处即可
    IvanLi127
        9
    IvanLi127  
       2024-01-17 19:34:12 +08:00 via Android
    我觉得多套一层,配套的工作量也不少。类型得定义下吧,文档得写上吧,同一个接口的多种不兼容的出入参得做重载或再写一份吧。
    上面做到了才有工程化上的优势,不然只会增加 debug 的复杂程度。
    愿意加强工程化的当然能抽象就抽象。不过后端靠谱的话,不建议在这上面花时间,或许在 BFF 上花时间收益还更高。
    itechify
        10
    itechify  
    PRO
       2024-01-17 19:54:53 +08:00 via Android
    当然统一管理了,不然乱的一批
    llej
        11
    llej  
       2024-01-17 20:01:10 +08:00
    不管放一起也好,分开也好,只要能够 f2 重构的时候全部自动改变就行
    pdzinc
        12
    pdzinc  
       2024-01-17 20:04:26 +08:00
    但凡项目大一点 必须上
    y3322
        13
    y3322  
       2024-01-17 20:07:14 +08:00
    简单项目感觉没必要。项目规模有一定规模,还是要有的
    zhy
        14
    zhy  
       2024-01-17 20:12:53 +08:00
    要不要统一管理,应该看谁来用这些 API ,如果要复用、共享,那当然要统一管理。
    另外统一管理是一项长期投资,不用以后还债
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2024-01-17 20:29:38 +08:00
    要的, 看过写在一起的 然后 vue 文件特别大。
    dumbass
        16
    dumbass  
       2024-01-17 22:16:26 +08:00 via iPhone
    我用工具直接解析 swagger 生成请求和类型,再也不用手写请求函数啦
    devswork
        17
    devswork  
       2024-01-17 22:43:11 +08:00
    当然要统一管理了:
    1. 引入一层封装 API ,可以提高复用性,比如各类 common API ,字典之类、用户信息获取类,免得到处都是 URL 复制粘贴
    2. 如果接口会变动,只需要改动这一层就行了,而且可以追溯到都有哪些地方用到了此 API
    3. 写拦截器,统一处理状态码,统一处理 header 、token 、以及一些特定的请求头要求
    4. 多个 API 组成一个功能时,可以很方便的写一个 function ,然后直接多个 API 调用配合 + 异常处理(撤销 API 、取消之类 API ),对于调用方而言只需要关心结果成功、或者失败 + 原因,封装细节不需要调用时有心智负担
    5. 忽略掉了网络请求和 axios 细节,对于调用方 import 进来直接 call 调用 function + 传参,不需要关心他是 POST 、GET ... 请求方法,不需要关心 header 放什么、不需要关心参数传递是放在 QueryParameter 还是 RequestBody 、PathVariable....因为一旦封装一层,就代表 API SDK 了,只需要引入调用就行
    CLMan
        18
    CLMan  
       2024-01-17 23:13:17 +08:00
    WEB API 本来就天然适合封装(模块化):

    - WEB 请求存在大量与应用本身无关的细节,这些细节不应该与业务逻辑混合在一起
    - 需要多个地方调用相同的 WEB 请求
    - 多个 WEB 请求需要复用处理鉴权、错误处理( HTTP 状态、自定义错误代码)的逻辑

    将 API 理解成远程调用的话,就更能理解为啥要封装了。

    将访问外部 API 接口进行统一管理是一个很自然的想法,你疑惑为啥要这么做,可能是因为你接触的问题复杂度不够或者你习惯了麻烦。

    云服务厂商在提供服务时,在提供 WEB API 的同时,同时提供封装的 SDK 也是差不多的道理。是因为用户存在相关需求,用 SDK 能降低开发成本。
    unt
        19
    unt  
       2024-01-18 09:46:23 +08:00
    正式项目“必须”上,没啥好讨论的。

    实验性项目就随便了,效率第一。
    limiter
        20
    limiter  
       2024-01-18 15:26:30 +08:00
    没必要,组件化开发之后各接口交由各组件自己维护调用,只封装统一的业务逻辑,鉴权、失败处理等。要允许部分资源的重复,都放在一块很容易创造上帝类,然后整个项目到处引用,改都不好改
    Dlin
        21
    Dlin  
       2024-01-18 17:16:01 +08:00
    统一管理的目的是进行复用。我不信你愿意这里写一段,然后 copy 到另一个地方,到时候要找用了这个 API 的地方到处翻,要是改一个啥,你还得到处改。
    gerefoxing
        22
    gerefoxing  
       2024-01-18 19:03:50 +08:00
    要的,向上面说的统一管理好处很多的。强迫症看到有重复的方法和 url 就难受。
    kuber
        23
    kuber  
       2024-01-18 20:34:57 +08:00
    我觉得 OP 可以了解一下软件架构设计方面的东西。封装无非是为了处理复用和应对变化。如果是做 POC 当然无所谓,怎么快怎么来,生产系统还是有必要的。
    有一本很好的书,Robert C. Martin 的“敏捷软件开发”。开篇就讲解了软件架构的原则,跟你的问题相关的有开闭原则和接口隔离原则。
    keepRun
        24
    keepRun  
       2024-01-18 23:53:14 +08:00
    统一管理对于大项目来说是很必要的,这是个好习惯。
    如果是小项目,那你怎么来都行,只要能跑就行
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1014 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:30 PVG 02:30 LAX 11:30 JFK 14:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86