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

restful api 的返回值问题

  •  
  •   wozhizui ·
    4amup · 2021-03-11 14:23:41 +08:00 · 2468 次点击
    这是一个创建于 1332 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在前端调用接口查询图书列表,结果根据前端传的参数,找不到图书,返回的结果写成成功还是失败呢? 说说理由。 方案一: { msg: '查询结果为空', success: true, books: [], }

    方案二: { msg: '查询结果为空', success: false, books: [], }

    17 条回复    2021-03-11 17:19:35 +08:00
    quan01994
        1
    quan01994  
       2021-03-11 14:27:53 +08:00
    restful 用 http 状态码来表示是否成功。
    imdong
        2
    imdong  
       2021-03-11 14:28:26 +08:00   ❤️ 1
    参数不符合要求,失败。
    参数符合要求,但没有结果,成功。
    参数符合要求,但约定接口必须返回数据,失败(少见)
    imdong
        3
    imdong  
       2021-03-11 14:29:35 +08:00   ❤️ 1
    接 @imdong #2 一般列表为空,也算成功,但是获取指定唯一数据( ID )为空时应该时 404 失败。
    quan01994
        4
    quan01994  
       2021-03-11 14:32:54 +08:00
    tabris17
        5
    tabris17  
       2021-03-11 14:35:41 +08:00
    “查询结果为空” 和 “books: []” 是冗余信息

    books: []已经表示结果为空了,何必 msg 重复一遍。而且结果为空并非错误,success 为何要设置成 false ?
    lihongming
        6
    lihongming  
       2021-03-11 14:38:57 +08:00 via iPhone
    RESTful 是一种指导思想,而不是具体的规定。三楼的做法与我们比较一致,但四楼的文章则存在很大争议,主要是该不该用复数的问题。

    所以,不要死抠这种问题,自己内部约定好空列表到底算成功还是失败即可。
    freakxx
        7
    freakxx  
       2021-03-11 14:45:05 +08:00
    。。。这两个方案都是脱裤子放屁类型

    你查询成功,接口没炸,就返回 200 。
    怼个 results,或者愿意叫 items,也好。
    前端检测数组是否为空来判断有没查询接过。
    ifuture
        8
    ifuture  
       2021-03-11 14:51:35 +08:00
    老哥,也是做图书项目的呀,
    ifuture
        9
    ifuture  
       2021-03-11 14:53:37 +08:00
    正确:{code:0 , data: []}
    错误:{code: 大于 0}
    wozhizui
        10
    wozhizui  
    OP
       2021-03-11 14:56:29 +08:00
    @lihongming 同意,restful 应该被看做一种思想。
    本问题就是想了解下这种情况通用的做法是什么,不是探讨 restful 规范。
    Oktfolio
        11
    Oktfolio  
       2021-03-11 14:56:59 +08:00
    根据唯一标识查详情查不到为 404 或 {success: false},列表没有数据是 {success: true, data: []}
    baiyi
        12
    baiyi  
       2021-03-11 14:59:58 +08:00
    首先,接口请求的响应状态由 HTTP 状态码所定,200 就是请求成功了。

    至于响应内容中的 success 字段,由业务需求,或者跟前端协商决定。

    最后,json 格式可以直接响应列表,所以从某种角度来说,msg,success 字段和 book object key 都是多余的。

    最最后,json 格式最后一个字段不能以 "," 结尾,这俩方案都是错的......
    otakustay
        13
    otakustay  
       2021-03-11 15:03:58 +08:00
    列表为空是成功,单条数据不存在是失败
    namelosw
        14
    namelosw  
       2021-03-11 15:27:59 +08:00
    200 + [] -> 成功
    400 + {message: "输入不对"} -> 失败
    404 + {message: "找不着“} -> 失败
    500 + {message: "找着找着挂了"} -> 失败
    IvanLi127
        15
    IvanLi127  
       2021-03-11 16:19:26 +08:00
    前端入参合法的话,你找不到也是合法的话,那就是成功,返回空数组。否则前端错 4xx,后端错 5xx 。
    前提是调用的是是图书资源。
    如果是调用例如作者的图书,找不到作者导致找不到书的,得 404 。最后,还是好好用状态码,返回的内容也最好不要嵌套没用的层。。。好难看呢(逃
    ieiayaobb
        16
    ieiayaobb  
       2021-03-11 16:43:42 +08:00
    query 和 get 是两种语义,query 可以返回列表是空,而 get 代表你是明确知道某个 id 去获取,如果找不到就是 404
    xuanbg
        17
    xuanbg  
       2021-03-11 17:19:35 +08:00
    资源名称是 knowledge 怎么办啊啊啊啊啊啊啊
    @quan01994
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:33 · PVG 01:33 · LAX 10:33 · JFK 13:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.