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

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

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

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

    前端会很抗拒这种设计吗

    21 条回复    2020-11-17 08:59:03 +08:00
    humpy
        1
    humpy  
       2020-11-12 16:58:13 +08:00
    那可以再去看看 graphql
    wunonglin
        2
    wunonglin  
       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   ·   实用小工具   ·   3515 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.