REST 接口让前端在请求中指定需要返回的字段是否合理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
qce7
V2EX    程序员

REST 接口让前端在请求中指定需要返回的字段是否合理?

  •  
  •   qce7 2020-11-12 16:52:48 +08:00 3356 次点击
    这是一个创建于 1795 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 大部分接口在不同界面对接口需要返回的接口需求都不一样
    • 如果全都用一个接口返回的话随着字段增加,接口速度会减慢(有些字段是通过关联表或外部接口获取)
    • 如果用不同的接口返回模型不同的字段,会出现很多相同模型不一样的 api,容易混乱

    基于以上考虑,相同模型通过前端指定返回不同的字段是比较合理的选择

    前端会很抗拒这种设计吗

    21 条回复    2020-11-17 08:59:03 +08:00
    humpy
        1
    humpy  
       2020-11-12 16:58:13 +08:00
    那可以再去看看 graphql
    shakaraka
        2
    shakaraka  
    PRO
       2020-11-12 16:59:45 +08:00
    后端不是有 control 和 service 吗,control 整合 service 的数据不就行了
    wysnylc
        3
    wysnylc  
       2020-11-12 17:03:18 +08:00   1
    字段不同就是结构不同,结构不同应当定义为不同接口
    yaphets666
        4
    yaphets666  
       2020-11-12 17:06:36 +08:00
    作为一个前端我是很烦这种.当然我知道有 GraphQL 这种东西. 我很好奇为什么接口不能分开呢? 通过 extends 和 Override 同时把以后可能同意修改的字段和各功能不同的字段区分开,可以解决这个问题吗?
    Sapp
        5
    Sapp  
       2020-11-12 17:08:21 +08:00
    我不理解为什么要这么干,你直接多开几个接口,接口后续再按照你自己的逻辑分发不就行了吗?一个不同的业务需求开一个新的接口,这不是很正常的吗?为什么非要一个接口一把梭,另外接口返回的数据最好是固定的类型,不然前端没有 ts 加持很容易出问题。
    yaphets666
        6
    yaphets666  
       2020-11-12 17:08:22 +08:00
    我不懂 JAVA 啊,这是不是有 SQL 注入的风险?
    a398058068
        7
    a398058068  
       2020-11-12 17:11:53 +08:00
    GraphQL
    love
        8
    love  
       2020-11-12 18:10:54 +08:00
    很合理的做法,在哪篇讲 rest 文章里我记得也是标准做法
    nekochyan
        9
    nekochyan  
       2020-11-12 18:22:19 +08:00
    很抗拒,基本都是不同结构就用不同接口
    misaka19000
        10
    misaka19000  
       2020-11-12 18:26:50 +08:00
    「会出现很多相同模型不一样的 api 」这是什么意思?
    beginor
        11
    beginor  
       2020-11-12 19:02:37 +08:00 via Android
    这个很合理吧,我们提供的的通用 API, 都是前端指定输出字段, 指定过滤条件。 服务端只要配置数据表就行了, 大家合作好开心
    beginor
        12
    beginor  
       2020-11-12 19:04:57 +08:00 via Android
    不服的话可以参考 GraphQL 以及 OData , 还有 elastic
    Kobayashi
        13
    Kobayashi  
       2020-11-12 19:12:41 +08:00 via Android
    GraphQL?
    shunia
        14
    shunia  
       2020-11-12 19:20:46 +08:00
    只能说适应了以后就挺香:
    1. 接口其实是变快了,因为相当于 batch,后台服务针对单个需求消耗的时间肯定是远小于创建 http 连接并等待返回的时间的;
    2. 后端接口会因此变得纯粹,更加弱业务化,很适合当前大前端 setState 这种风格的开发模式;
    3. 前端代码也会因此从设计上更加模块化,做好合理的数据拆解后,分别 dispatch 到不同的模块里很奈斯;
    xuanbg
        15
    xuanbg  
       2020-11-12 19:23:39 +08:00
    多几个接口不是坏事,永远不要试图把不同需求的接口合并成一个。
    jasl
        16
    jasl  
       2020-11-13 02:09:36 +08:00
    其实顺着这个思路协议没出大毛病的话。。。

    恭喜你重新发明了 https://jsonapi.org/
    Gleven
        17
    Gleven  
       2020-11-13 09:26:22 +08:00
    建议试试 graphql,完美解决楼主提出的问题
    goodboy95
        18
    goodboy95  
       2020-11-13 10:09:22 +08:00
    @yaphets666 sql 注入倒不用担心,可以在后端搞一个字段白名单,白名单之外的不给
    Elroooo0Y
        19
    Elroooo0Y  
       2020-11-13 10:58:37 +08:00
    不同的场景让前端传不同的场景 id
    后台对不同的场景配置不同的查询数据策略
    aguesuka
        20
    aguesuka  
       2020-11-13 13:09:24 +08:00 via Android
    假如你的接口是一个函数,你的想法就是给这个函数加上一个泛型参数。如果对类型系统没有深刻的理解的话,业务的复杂程度越高,这个接口成为一坨的几率也越高。

    不过如果你是程序语言专家,自信可以精通自己写的 dsl,或者接口足够简单。完全可以放飞自我。
    oliver2bao
        21
    oliver2bao  
       2020-11-17 08:59:03 +08:00
    先回答题主的三个问题

    - 接口可分为公共接口,和页面独有的接口。比如授权,用户信息这些就是公共接口
    - 用一个接口通过修改参数的方式返回所有数据显然是不合理的,这样需要在一个 controller 里面大量的 router 应该做的事,既然这样为什么让 router 做 router 的事,为什么还要手动实现一个 router 的判断呢?
    - 同一个接口也可以返回类似的数据的,可以通过前端传递不同的参数来决定是否返回某些数据。另外建议可以系统了解下 restful api 的设计,阮一峰的博客就有。

    其实我说的这些就是二楼 @wunonglin 说的,以 egg.js 框架的逻辑来说。

    一个请求进来,先经过 router 筛选,选择正确的 controller 入口,进入之前,先经过 middleware 的处理。一般来说 router 和 controller 是一对一的关系,当然也能写成多个 router 对于一个 controller,但是那样没任何一样。

    在 controller 中调用多个 service 来处理,有些 service 会调用 model,有些却不用。后端不应该直接把 model 直接暴露给前端调用的,毕竟不是什么数据都可以直接无限制的暴露出去。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5704 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 01:42 PVG 09:42 LAX 18:42 JFK 21:42
    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