V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
refresh
V2EX  ›  问与答

restful API 中,signIn 和 signUp,以及 signOut,你们怎么设计

  •  
  •   refresh · 2014-06-17 21:58:29 +08:00 · 28553 次点击
    这是一个创建于 3819 天前的主题,其中的信息可能已经有所发展或是发生改变。
    统一用一个接口,然后crud?还是写四个接口
    第 1 条附言  ·  2014-06-18 20:33:55 +08:00
    patch你们常用么,蛮多浏览器不支持,但实际上我们也可以用_method的方式来解决这个问题,你们会这么用么。
    有没有常常某个资源可能只有一个操作,比如说post,而其它操作都不会有。
    15 条回复    2015-07-30 18:47:27 +08:00
    refresh
        1
    refresh  
    OP
       2014-06-17 22:00:24 +08:00   ❤️ 1
    mytharcher
        2
    mytharcher  
       2014-06-17 22:49:56 +08:00   ❤️ 9
    1L帖子里说的比较科学,登入/登出对应的服务端资源应该是session,所以相关api应该如下:

    GET /session # 获取会话信息
    POST /session # 创建新的会话(登入)
    PUT /session # 更新会话信息
    DELETE /session # 销毁当前会话(登出)

    而注册对应的资源是user,api如下:

    GET /user/:id # 获取id用户的信息
    POST /user # 创建新的用户(注册)
    PUT /user/:id # 更新id用户的信息
    DELETE /user/:id # 删除id用户(注销)
    binux
        3
    binux  
       2014-06-17 23:02:04 +08:00
    我觉得 restful 的接口应该是无状态的,需要保存状态的是客户端。2L 说得对
    wtbhk
        4
    wtbhk  
       2014-06-17 23:48:53 +08:00
    @mytharcher 学到新姿势了
    serco
        5
    serco  
       2014-06-18 09:32:28 +08:00
    @mytharcher

    DELETE /user/:id # 删除id用户(注销)

    注销?那你怎么删除用户打算用什么?
    还是童鞋觉得注销就是删除的意思呢?
    bsbgong
        6
    bsbgong  
       2014-06-18 09:54:18 +08:00
    @serco
    这取决于你站点的设计
    一般来说,注销账户是PUT操作
    还有重新激活和彻底删除账户两个操作
    mytharcher
        7
    mytharcher  
       2014-06-18 14:53:10 +08:00   ❤️ 1
    @serco 你可以考虑“注册”跟“注销”这两个词的对应关系,我个人认为“注销”就是删除的意思,在这是比较恰当的,但是很多网站认为“注销”是登出的意思,我反而觉得用词不当。

    注销:取消登记在册(在案)的事项。比如注销一家公司,注销驾驶执照等。更相当于删除而不是登出,这样容易理解点了么。
    serco
        8
    serco  
       2014-06-18 19:54:05 +08:00
    @mytharcher

    我同意注销该是删除的意思,但是目前大家的普遍认知已经是退出登录的意思,包括某百科,所以我觉得还是不要再去使用注销作为删除的意思会比较好。
    refresh
        9
    refresh  
    OP
       2014-06-18 20:32:25 +08:00
    @serco

    通常我们在网站上的注销,应该是session的crud。按传统的做法,我们可能是用signin/signinup/singinout
    restful api的话,就是分成两个,session和user,再对应到具体的crud。

    put:session我觉得可以用用来做心跳。

    @mytharcher
    mytharcher
        10
    mytharcher  
       2014-06-18 22:57:33 +08:00   ❤️ 1
    @serco 的确普遍认知已经被错误的翻译教坏了,甚至刚看了眼Mac系统里的当前用户退出登录的翻译也是“注销”,记得XP里面也是。

    但我认为开发者有义务在涉及到的项目中提醒PM/UE去修正这个错误,而不是让这个错误的用法延续下去。所以我个人会在所有涉及的项目中都推行“登入”/“登出”这个翻译(甚至应该是“签入”/“签出”,类似签到),而基本不去用“注销”(大多数系统都没有删除账号的功能)。

    PS:注意到v2的退出登录文字是“登出”,赞一下!:P

    另外说到PATCH方法,其实应该在大多数情况下代替PUT,因为很多记录更新只是其中少数字段。不过大多数时候我们都很懒,总是更新所有的字段,不管用户是否修改了它。所以这点上接着用PUT也还凑合。

    记得关注TJ大神的GitHub动态时看到过一次 npm install methods 这个包的更新,最早只有上面帖子里的4个动词,而最新版增加了一堆,足足有25个,很多都没见过,够玩RESTful的同学们学一阵子的了。

    附链接: https://github.com/visionmedia/node-methods/blob/master/index.js
    yingluck
        11
    yingluck  
       2014-08-30 16:33:37 +08:00
    @mytharcher 现在的注册功能为了防机器人无意义注册,大都添加了邮箱激活或者短信验证,常常是填写邮箱密码后跳转到新地址,要求去邮箱中激活,那么注册页面还应该是 post /user 吗?我觉得应该放到邮箱激活链接中,但是这样一来就变成了get URL加参数。
    mytharcher
        12
    mytharcher  
       2014-08-30 23:36:17 +08:00   ❤️ 1
    @yingluck

    你可以考虑下当用户填写完注册信息提交的时候,实际上你已经在数据库添加了一条记录,即使还需要邮箱激活等验证,也只是后续更新这条记录而已,所以对于“用户”这个资源的创建,依然是`POST /user`。

    为什么我没有提到任何“页面”这个字眼,因为把这和RESTful API联系在一起有时候是矛盾的,因为对于单纯浏览器展示的页面来说,其实每次都应该是GET,只是获取嘛。但是只从RESTful为什么要跟API连在一起,实际上就是更偏重API的方式,而response的content-type不一定总是text/html。从这个角度来考虑的话,RESTful的API更适合使用单页式的重JavaScript来开发全站Ajax应用,因为数据的交互都通过API调用完成了,不再有传统意义的页面跳转,所以也就规避了页面和API都要RESTful的矛盾。

    所以如果你一定要使用纯净的RESTful API设计模式,那最好暂时不要考虑搜索引擎抓取了。

    以上均为个人理解,如有疏漏还请指出。
    yingluck
        13
    yingluck  
       2014-08-31 09:23:29 +08:00
    @mytharcher 说的很有道理,已感谢
    kyyych
        14
    kyyych  
       2015-07-30 16:40:00 +08:00
    忘记密码, 获取短信验证码应该如何设计呢? 放在哪个资源下比较好?
    refresh
        15
    refresh  
    OP
       2015-07-30 18:47:27 +08:00   ❤️ 1
    @kyyych

    post/get member/forgot-password
    get/post member/validate-sms

    供参考

    @mytharcher
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.