Restful API 关于批量删除的设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jayn1985
V2EX    程序员

Restful API 关于批量删除的设计

  •  
      jayn1985 2014-12-16 10:45:39 +08:00 22774 次点击
    这是一个创建于 4013 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业余时间自己在搞一个小项目,后端使用Restful API设计,针对单一实体的操作这个很容易理解和设计,批量操作的话增改查也都有对应的处理方法,但是目前只有针对批量删除我这边有点卡壳,看了一些Restful APi设计的文章,里面提到针对DELETE方法,一般不建议在请求时添加消息体body,那么针对批量删除的场景大家都是怎么设计的呢?有没有什么业界通用的方法呢?
    20 条回复    2014-12-17 11:46:05 +08:00
    paradislover
        1
    paradislover  
       2014-12-16 13:08:40 +08:00
    以前参考过http://www.ruanyifeng.com/blog/2014/05/restful_api.html
    自己分组或者添加ID范围?
    tairan2006
        2
    tairan2006  
       2014-12-16 13:11:47 +08:00
    单条和批量本质上是一样的啊,都是通过query string确定,只是单条有唯一标识符(比如id=1),批量就是一个范围(id>3&id<5).
    icanfork
        3
    icanfork  
       2014-12-16 13:17:57 +08:00
    @tairan2006 restful 哦

    我觉得 delete /users/1,2,3,4 (逗号可以做分隔符不?)
    welsmann
        4
    welsmann  
       2014-12-16 13:20:41 +08:00   1
    为了restful而restful这样好么...
    ozking
        5
    ozking  
       2014-12-16 13:25:02 +08:00
    “ 一般不建议在请求时添加消息体body”,我最后还是加了body,方便-_-#
    arron
        6
    arron  
       2014-12-16 13:25:47 +08:00
    users/:action?id[]=1&id[]=2&id[]=4

    这样前端一组checkbox,后端一个array,方便。
    ozking
        7
    ozking  
       2014-12-16 13:30:14 +08:00
    不过很多库都不支持delete with body,lz慎重选择
    hcymk2
        8
    hcymk2  
       2014-12-16 13:35:44 +08:00
    如果批量删除数据的size比较小 ,并且是具体的数据,可以用3L的方式 而且有些restful框架支持将3L方式的path转换成数组。
    GhostFlying
        9
    GhostFlying  
       2014-12-16 13:37:40 +08:00
    Google 的做法似乎是 batch request
    jayn1985
        10
    jayn1985  
    OP
       2014-12-16 15:06:25 +08:00
    @belin520
    @hcymk2
    @arron

    数据小的话确实可以通过query string来完成这事,但是我这边情况又有些特殊,首先id号不是自增的数字,而是mysql生成的uuid串,一个id号的长度就已经够长了,若是N个话,会出现url长度过长的问题吧。。。
    jayn1985
        11
    jayn1985  
    OP
       2014-12-16 15:09:38 +08:00
    @welsmann 求解决方法,主要是目前使用的各种http method都各司其职,不想专门针对这个case来做workaround,LZ有些许代码洁癖,额。。。
    bsbgong
        12
    bsbgong  
       2014-12-16 16:07:26 +08:00
    如果你用uuid作为id,又要这个批处理API的话。
    我能想到的就是模仿http中的chuncked方式通信。约定总数或设置结束标记,前台分次发送,后台做缓存,结束标记时统一处理,返回结果。

    顺便问一下:对表记录的id属性,为什么使用uuid?
    我觉得是浪费,乱用uuid。
    lygmqkl
        13
    lygmqkl  
       2014-12-16 17:35:14 +08:00
    特殊情况还是用body吧,个人感觉uuid 很费。。。。没有必要。。。

    也可以换一种思路,一个post + 一个delete
    post: save workflow into table, like operate.o_id=12, have 12 uuid
    delete: delete/o_id
    lygmqkl
        14
    lygmqkl  
       2014-12-16 17:35:58 +08:00
    btw, 一般遇到这种情况我会选择一种非restful的方法来实现,为了保证开发时效。
    gevin
        15
    gevin  
       2014-12-16 21:51:44 +08:00
    这篇文章设计了一个用put做soft delete的变通批量删除方法
    http://www.l1ghtm4n.com/post/53259404576/patterns-for-rest-api-bulk-operations

    我个人觉得REST批量删除还是尽量避免
    ryanking8215
        16
    ryanking8215  
       2014-12-17 07:08:38 +08:00 via iPhone
    jsonapi.org 撸主可以参考一下
    jayn1985
        17
    jayn1985  
    OP
       2014-12-17 10:13:02 +08:00
    @bsbgong
    @lygmqkl
    选择uuid还是自增id作为主键之前也做了很多比较,因为工作也不是专职DBA,看到uuid相对自增id还是有些优势的(非InnoDB引擎),而且性能上差别也不是很大,有些人说这样导致url看起来很长很丑陋,我觉得这反而是个优势,像v2ex网站,大家可以看下每个帖子的url,其实还是能明显看出id号的增长情况的,这个有时候反倒是个隐患(比如商业分析),当然可能是自己想太多了,毕竟只是个小项目。说到这个问题,我倒是很想知道这两种主键策略,在一定的数据量下,mysql的性能和存储空间到底有多大的差别,这个网上也是个说纷纭,所以希望可以指点一二
    jayn1985
        18
    jayn1985  
    OP
       2014-12-17 10:15:59 +08:00
    @gevin 这篇文章恰好昨天再发这个帖子之前也看到了,归根到底还是一种变通的方式,不过确实如前面几位童鞋说,restful设计只是一种guideline,有些时候还是需要综合考虑和衡量
    bsbgong
        19
    bsbgong  
       2014-12-17 10:46:02 +08:00
    @jayn1985
    我也是前段时间去查了下uuid,以前没怎么注意。
    https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions1-10/how-to-create-a-UUID-in-Javascript.md
    一般程序里都没必要用uuid,你需要的只是一个uniq id。

    这跟mysql的性能问题关系不大,主键的长短不影响索引的结构。当然最查找性能还是有点影响,毕竟不是自增量。而且最核心的匹配就是字符串比较,越长越慢呗。

    至于商业隐患,这就看你们自己的衡量了。
    arron
        20
    arron  
       2014-12-17 11:46:05 +08:00
    @jayn1985 那就post啊。本来这种数据库更改删除操作基本都用post。 /users/delete
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     943 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:36 PVG 06:36 LAX 14:36 JFK 17:36
    Do have faith in what you're doing.
    ubao msn 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