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

Restful API 里,应该怎么处理最后的 /

  •  
  •   lhbc · 2016-02-22 12:03:48 +08:00 via Android · 3393 次点击
    这是一个创建于 3228 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按规范,比如请求用户列表,应该是
    /api/users
    那对于 /api/users/ 这种请求应该直接 404 还是等同 /api/users 处理?

    20 条回复    2016-02-23 10:29:56 +08:00
    v1024
        1
    v1024  
       2016-02-22 12:32:22 +08:00
    标准的话,应该不处理结尾的 / ,因为 / 代表目录,隐含意思是 /index.htm 。
    Jafee
        2
    Jafee  
       2016-02-22 12:34:28 +08:00
    dacapoday
        3
    dacapoday  
       2016-02-22 12:34:52 +08:00
    直接返回一套字符串 显示 接口的说明,格式,使用方法?
    或者该 API 的运行状态?
    dacapoday
        4
    dacapoday  
       2016-02-22 12:37:15 +08:00
    错了错了,我以为是根目录,无视上条
    learnshare
        5
    learnshare  
       2016-02-22 12:59:39 +08:00
    #1 的观点是对的,加了 / 代表这个目录,默认是 /index.html
    timonwong
        6
    timonwong  
       2016-02-22 13:16:45 +08:00
    对于 1 楼的观点,也有另外一种解释
    因为请求列表是一个 LIST 行为,对于 LIST 行为,应该按照目录处理,所以就应该是
    GET /api/users/
    lhbc
        7
    lhbc  
    OP
       2016-02-22 13:48:41 +08:00
    @v1024
    @learnshare
    @timonwong
    GET /api/users/ 这个操作应该没问题
    不过对 /api/users/ 进行 POST(添加用户) 好像有点怪怪的

    Restful 里好像没定义目录的概念,所有想弄清楚规范里是建议怎么处理的
    搜索 restful directory, restful "last splash" 都没找到相关内容


    @Jafee
    这篇文章是对应浏览器和蜘蛛
    Restful 应该不太一样
    dorentus
        8
    dorentus  
       2016-02-22 14:02:49 +08:00
    实在不知道的话就参考别人的实现么,例如 github 的:
    https://api.github.com/user 是可用的
    https://api.github.com/user/ 则返回 404
    lhbc
        9
    lhbc  
    OP
       2016-02-22 14:07:27 +08:00
    @dorentus 忘记了去参考一些大站的实现
    thanks all.
    mcfog
        10
    mcfog  
       2016-02-22 14:53:25 +08:00
    @lhbc 因为 splash 是飞溅, slash 才是斜杠

    另外,一般说 trailing slash
    learnshare
        11
    learnshare  
       2016-02-22 15:32:28 +08:00
    @lhbc RESTful 也是基于 HTTP ,参考 HTTP 协议的实现就好了
    carlding
        12
    carlding  
       2016-02-22 18:00:25 +08:00
    在 chrome 输入 www.baidu.com ,等进入网页后你把 url 复制粘贴到文本会发现自动多加了一个'/',所以还是等同处理吧。
    这个'/'有无大部分人应该都会忽略吧。
    毕竟不能将'/'后面认为是一个空字符串吧。
    qq529633582
        13
    qq529633582  
       2016-02-22 18:49:28 +08:00 via iPhone
    @carlding 这个只有根目录才会的
    aprikyblue
        14
    aprikyblue  
       2016-02-22 19:08:04 +08:00
    @carlding
    只有根目录+1 ,
    根目录是 /,为空就不太科学了吧。。

    以前看某些文章貌似说一些 http server 会把 http[s]://host 给 301 到 http[s]://host/ (当然前提是 client 发出了这种请求),没验证过


    另外对 LZ 问题,我赞同 6L
    jybox
        15
    jybox  
       2016-02-22 19:50:02 +08:00
    我想提一种情况,比如有两个 API : DELETE /users 和 DELETE /users/:name ,分别是删除所有用户和删除指定用户。如果在调用后者时忘记加 name ,就变成了 DELETE /users/,我觉得最好还是不要当作前者,而是直接报错好一些。
    owlsec
        16
    owlsec  
       2016-02-22 20:02:24 +08:00
    @jybox 心疼 leancloud
    lhbc
        17
    lhbc  
    OP
       2016-02-22 21:10:31 +08:00
    @jybox
    @owlsec
    这个……真有真实案例?
    julyclyde
        18
    julyclyde  
       2016-02-22 22:28:45 +08:00 via iPad
    @aprikyblue 发不出这种请求。你看看 http 请求行的格式
    aprikyblue
        19
    aprikyblue  
       2016-02-22 23:02:17 +08:00
    @julyclyde 我也想到了 http 请求的格式,所以才说“为空就不太科学了”
    刚才去试了试,百度神马也没返回,必应返回了 400 Bad Request
    是我道听途说了
    dalang
        20
    dalang  
       2016-02-23 10:29:56 +08:00
    我自己写得 rest api , /api/users/ 这种请求是直接 404 处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:09 · PVG 22:09 · LAX 06:09 · JFK 09:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.