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

请教一下各位,写 api 的时候,使用 put 和 patch 方法 ,怎么处理可选参数 ?

  •  
  •   maemo · 2019-03-02 10:27:21 +08:00 · 4368 次点击
    这是一个创建于 2099 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如有一个 model:

    pet {
      name, 
      category,
      tags,  (optional)
    }
    

    tag 是可选的,当我用 post 创建的时候,可以不传 tag 这个参数,默认为空。但是当我用 put 更新实体的时候,我有点疑惑了。

    根据定义,put 可以用来更新资源,并且包含整个实体的信息。那么是否每次调用 put 的时候都要把所有的参数都带上,包括可选的参数 ?那么我在方法中就要判断每个参数是否都传递了,而在 post 方法中我就不需要这一步了,似乎有点麻烦。

    如果想只更新某一部分信息,用 patch 方法,不管是否是可选参数。

    我看 swagger 上的例子,put 方法标明了哪些是可选参数,http://petstore.swagger.io/#/pet/updatePet ,那么这似乎和 patch 有点相似了,只更新部分信息,可能是我理解的不太清楚。

    不知大家在写 api 的时候是怎么处理这样的情况的,麻烦指点一下。

    8 条回复    2019-03-03 11:03:32 +08:00
    kaneg
        1
    kaneg  
       2019-03-02 11:22:44 +08:00 via iPhone   ❤️ 1
    put 的时候如果不传可选参数,则使用默认值,比如空值,而 patch 的时候不传的参数都保持原值。
    maemo
        2
    maemo  
    OP
       2019-03-02 11:28:56 +08:00
    @kaneg #1 如果使用默认值,那我在 put 的 handler 中就需要判断哪些参数传了,哪些参数没有传。对于没有传的参数,我需要从 obj 中获取,再赋值,最后再更新整个 obj。不知我这样做是否正确。但是这样似乎和 patch 方法的 handler 有点重复了,在 patch 的 handler 中我也需要去判断传递了哪些参数。不知我理解的对不?
    WilliamYang
        3
    WilliamYang  
       2019-03-02 12:14:19 +08:00
    @maemo 我认为你的理解是对的, 但是语义上本来是不同的, 一个代表 update, 另一个代表 partial_update
    kaneg
        4
    kaneg  
       2019-03-02 13:05:05 +08:00 via iPhone   ❤️ 1
    @maemo 正如 williamyang 所说,这两个操作都是为了保证对 API 的调用者提供两种截然不同的语义,这种语义就是一种契约。而实现者在满足这种契约的前提下可以可以使用不同的实现。
    mornlight
        5
    mornlight  
       2019-03-02 14:10:48 +08:00
    @maemo #2 为啥要从 obj 中拿出来再赋值回去,我认为这个 PUT 和 POST 处理流程一样,默认参数不传时都按接口定义的默认值处理,POST 只是多了个 new 的步骤。
    maemo
        6
    maemo  
    OP
       2019-03-02 15:17:43 +08:00
    @mornlight #5 我理解的是如果没有传参,默认为空时,直接保存,会把原来已经存在的值覆盖,所以在想要不要从 obj 中取出来
    GTim
        7
    GTim  
       2019-03-02 15:21:38 +08:00
    @kaneg 这个解释好
    maemo
        8
    maemo  
    OP
       2019-03-03 11:03:32 +08:00
    @kaneg #4 这个解释简单明了,我后来又理解了一下,不管我方法的具体实现是怎样,只要符合规范的语义就行了。我之所以有这个疑问,是我把具体的实现方法也考虑进去了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:38 · PVG 00:38 · LAX 08:38 · JFK 11:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.