• 请不要在回答技术问题时复制粘贴 AI 生成的内容
qce7
V2EX  ›  程序员

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

  •  
  •   qce7 · Nov 12, 2020 · 4254 views
    This topic created in 2186 days ago, the information mentioned may be changed or developed.
    • 大部分接口在不同界面对接口需要返回的接口需求都不一样
    • 如果全都用一个接口返回的话随着字段增加,接口速度会减慢(有些字段是通过关联表或外部接口获取)
    • 如果用不同的接口返回模型不同的字段,会出现很多相同模型不一样的 api,容易混乱

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

    前端会很抗拒这种设计吗

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

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

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

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

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

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

    在 controller 中调用多个 service 来处理,有些 service 会调用 model,有些却不用。后端不应该直接把 model 直接暴露给前端调用的,毕竟不是什么数据都可以直接无限制的暴露出去。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1767 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    ♥ Do have faith in what you're doing.