设计 RESTful API 时,如果前端同一页面需要请求几条不相关的数据时,是分开逐条请求么?有没有打包请求多组数据的设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
newtype0092
V2EX    问与答

设计 RESTful API 时,如果前端同一页面需要请求几条不相关的数据时,是分开逐条请求么?有没有打包请求多组数据的设计?

  •  
  •   newtype0092 2018-05-11 11:09:02 +08:00 4403 次点击
    这是一个创建于 2709 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不相关的数据是指:假如我想在某个页面显示物品列表时,同时底部滚动展示一些 tips,可能还需要一些展示相关的配置数据。
    这些数据如果按 RESTful 设计的话感觉是不该放在一个 API 里的,但如果是数据种类很多但每种数据量较少时,肯定是一条请求获取的效率比较高吧。
    24 条回复    2018-07-16 19:13:42 +08:00
    xiaoxinxiaobai
        1
    xiaoxinxiaobai  
       2018-05-11 11:18:03 +08:00 via Android
    看你怎么定义资源吧,可以灵活掌握
    iappled
        2
    iappled  
       2018-05-11 11:19:17 +08:00   1
    Graph API
    auroraccc
        3
    auroraccc  
       2018-05-11 11:52:00 +08:00   1
    graphql 了解下
    whuhacker
        4
    whuhacker  
       2018-05-11 12:36:29 +08:00
    HTTP2 链路复用已经解决了效率问题
    changrui0608
        5
    changrui0608  
       2018-05-11 13:04:40 +08:00 via Android
    服务器端可以这样返回:
    {"resource": 资源本体, "tips": tips 本体, "config": 配置数据},
    或者把 tips 和 config 都放进一个叫 metadata 的字段内,这些都还算是 restful 的常用做法。
    wizardforcel
        6
    wizardforcel  
       2018-05-11 13:28:09 +08:00 via Android
    测一下哪个更快

    rest 的设计上可以创建新的只读资源 xxxPageData,包含原有资源 items, tips, ... 作为其属性
    artikle
        7
    artikle  
       2018-05-11 13:28:23 +08:00
    Graphql+1,不过效率要权衡,正常是偏低的
    zhandi
        8
    zhandi  
       2018-05-11 13:29:04 +08:00 via iPhone
    网关吧
    stillsilly
        9
    stillsilly  
       2018-05-11 13:45:53 +08:00
    RESTful 不适合完全照搬它那些原则写业务…… 粒度太粗……
    wish198
        10
    wish198  
       2018-05-11 14:14:30 +08:00
    RESTful 这些年被翻出来感觉有点被炒作的感觉,当时看了一圈 BAT 的实际使用的 API 就能感觉出来,RESTful 以请求动作来区分 API 功能在实际使用就是爽流氓
    newtype0092
        11
    newtype0092  
    OP
       2018-05-11 14:17:22 +08:00   1
    @stillsilly @wish198
    最近才开始做后端,看了下 RESTful 相关的东西,感觉设计的非常清晰,看起来很优雅,教程上的例子都特别合适,但对一下自己的业务发现完全照这么设计每一页都得发好多请求才行。。。
    newtype0092
        12
    newtype0092  
    OP
       2018-05-11 14:19:00 +08:00
    @auroraccc @artikle 还是新手,感觉这个东西成本略大,正在跑的系统不太敢这么折腾。。。
    wish198
        13
    wish198  
       2018-05-11 14:40:24 +08:00
    @newtype0092 你的问题其实分开合并都可以,但是要考虑实际情况。
    如果拆成多条网络请求可能会减少设计上的耦合,但是可能会占用带宽。 算下请求的频率和使用率。反正还是看业务,不要死守着什么 RESTful
    banks0913
        14
    banks0913  
       2018-05-11 14:50:21 +08:00
    按照 restful 的接口设计原则,除了对简单 Entry 的 CRUD, 其他杂七杂八的业务很难满足
    liuzelei
        15
    liuzelei  
       2018-05-11 15:13:01 +08:00   1
    这就需要你的架构师好好考量你们的设计。
    一般实践中,api 的设计都不是跟着客户端走的,而是跟着业务走的,你业务抽象的好,你的 api 就能规划的很好,自然就会 restful。
    但是很不幸,很多的系统 api 写的跟 shit 一样,这里面包括很多 bat 的 api,都跟 shit 一样。
    param
        16
    param  
       2018-05-11 15:16:53 +08:00 via Android
    Graph API
    另外如果有类似需求的话,试一下自己封装一下把多个请求合并为一个
    stillsilly
        17
    stillsilly  
       2018-05-11 15:44:02 +08:00   2
    增删改查这 4 个动作,能完全覆盖、精准地描述你们的花式的业务需求吗?
    如果不能,那就不要完全照搬那些原则…… 只用方便使用的那部分
    newtype0092
        18
    newtype0092  
    OP
       2018-05-11 19:04:02 +08:00
    @param 现在就是封装过的,只是感觉没法做到那么符合 RESTful 标准,因为没办法一个 API 只做一件事。。。
    newtype0092
        19
    newtype0092  
    OP
       2018-05-11 19:10:59 +08:00
    感觉纯的业务请求都还好,主要是 GET 数据的时候,为了优化体验总是会根据前端页面的展示需求去封装数据,这种时候就会混合一些可能不相关的东西打包返回,也就不 RESTful 了。
    网上看了一些资料都说要尽量 RESTful,所以以为大家是不是有什么方法专门应对这种问题,不过看大家的回复好像那些文章都有点极端吹了。。。
    IvanLi127
        20
    IvanLi127  
       2018-05-11 19:39:18 +08:00 via Android
    实在多就套层 api 网关整合下吧。api 改花了也不好。。。
    night98
        21
    night98  
       2018-05-11 20:13:32 +08:00 via Android
    前端可以考虑用 nodejs 请求后端接口组合必要数据,后端接口粒度细一些,做好缓存就可以了
    newtype0092
        22
    newtype0092  
    OP
       2018-05-12 10:35:21 +08:00
    @IvanLi127 问下你们说的网关就是指 Router 模块么?新手不太懂后端的一些术语,前面有说网关的我还想着难道要配个 gateServer...
    IvanLi127
        23
    IvanLi127  
       2018-05-12 11:20:51 +08:00 via Android   1
    @newtype0092 就是单独一个服务,不是路由,百度下 api 网关
    TommyLemon
        24
    TommyLemon  
       2018-07-16 19:13:42 +08:00
    RESTful 问题多了去了
    github.com/TommyLemon/APIJSON/wiki
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6044 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 02:33 PVG 10:33 LAX 19:33 JFK 22:33
    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