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

问个 RESTful API 设计的问题

  •  
  •   Orenoid · 208 天前 · 1897 次点击
    这是一个创建于 208 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在想要对某个资源进行更新,路径 /path/to/resource 方法用 PUT 或者 PATCH
    这个资源有多个属性,例如 A、B、C 属性
    而我在不同场景下需要对不同属性进行更新,并且在业务上需要进行额外的判断,而不是简单的把前端给的值直接覆盖进去
    更复杂的情况可能还会有更新 A、B,或者更新 B、C 这种交错的情况,说白了就是一个资源上有多个场景下的更新逻辑
    这种情况下感觉在一个 URI 下很难实现啊,通过在接口里加字段来判断执行哪种逻辑的话,感觉本质上跟区分不同的 URI 没什么区别。。

    18 回复  |  直到 2019-03-29 15:08:31 +08:00
        1
    alexmy   208 天前
    用 Graphql ? 之前看了看这东西,还没有实际应用。

    比如 两个用户共同关注的对象,这个...
        2
    zivyou   208 天前
    我觉得这个 URI 设计的不合理,得定位到资源 A, B, 或 C。
        3
    mcfog   208 天前 via Android
    一个 uri 用 patch, 传一个 array of business operation 进去就行了

    https://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/
        4
    FingerLiu   208 天前
    @alexmy graphQL 不是干这个事的。
    这个场景,感觉应该根据业务定义不同的 action
        5
    mooncakejs   208 天前   ♥ 1
    rest 不处理事务相关的,要不就是 abc 分开更新,要不就定一个组合的 resource 进行 patch
        6
    ZSeptember   208 天前
    rest 这种所有操作都要对应资源还是不够用,明明是一个动作,就不要强行对应到一个资源上去了。
        7
    index90   208 天前
    我觉得没有问题啊。
    PATCH 更新部分字段,PUT 更新所有字段,如果前端用 PATCH,他传什么属性就修改什么属性啊。问题在哪里?我没读懂
        8
    index90   208 天前
    如果你是希望一个 URI 可以显式限定可修改字段,可以这样设计:
    PUT /path/to/resource/A,B // 修改 A,B 属性
    PUT /path/to/resource/B,C // 修改 B,C 属性
        9
    wizardoz   208 天前
    可能需要在 Restful API 之上再加一个业务层,提供业务 API。
        10
    lhx2008   208 天前 via Android
    是不是粒度太大了,如果有联动的操作的话,可以再细分二级的资源比较好
        11
    MoHen9   208 天前 via Android
    7 楼说的对
        12
    hubqin   208 天前 via Android
    我们做过的一个是传个 type 参数,后端根据这个类型决定执行哪些操作。
        13
    freakxx   208 天前
    Patch /path/to/resource/<id>/

    data :
    {
    "a" : "test",
    "b": "test"
    }

    ----
    Patch /path/to/resource/<id>/

    data :
    {
    "b" : "test",
    "c": "test"
    }


    在渲染层再做业务的处理
        14
    Variazioni   208 天前
    #7 没毛病。。
        15
    mayorbryant   208 天前
    7 楼说了我想说的
        16
    libook   207 天前   ♥ 1
    REST 是围绕资源来设计的,而资源不一定是我们底层的数据结构;
    接口提现的不是数据,更多体现的是业务,所以简单粗暴把数据结构的 CRUD 直接作为 REST 接口来设计,会遇到很多问题。

    建议的思路是,将修改 A 和 B 与修改 B 和 C 看做两个业务,然后再抽象出一个或两个不同的资源,然后再以资源设计 API。

    比如底层 User 数据结构有 password、salt 这两个字段用来支持修改密码的业务,还有 company、job 用来支持修改工作信息的业务,那么可以抽象成密码和工作两个资源,各为一套接口。如果存在类似但不同的概念,为了避免歧义,可以分层,用户资源下面有密码和工作两个子资源。
        17
    superZzr   207 天前
    #7 说的的确是没毛病,但是问题是,这样的不同业务场景识别,能放到前端去做么?
        18
    index90   207 天前 via iPhone
    @superZzr 看 #16

    面向前端的接口要站在前端的角度去设计,所谓资源,也是前端角度的资源
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4318 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 01:51 · PVG 09:51 · LAX 18:51 · JFK 21:51
    ♥ Do have faith in what you're doing.