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

关于 RESTFUL API,求解释

  •  
  •   edison111cry · 2017-03-07 11:21:40 +08:00 · 2837 次点击
    这是一个创建于 2605 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看大家讨论 RESTFUL API 比较多,网上搜了一通也是一头雾水。这个东西是指一种思想,还是一种标准,还是啥?

    比如我写服务器端给 APP 写增加评论的接口,

    http://www.test.com/index.php/Comment/addComment/uid/1234/content/good

    这个 URL 我会发给 APP ,然后告诉他们,传用户的 uid 以评论的内容 content 。 返回 json 数据里 code 为 1 是成功,为-1 不成功。

    APP 他们就按照这个格式调用就可以了。我觉得一般公司做项目都是这种流程吧?

    这跟 RESTFUL API 有什么区别呢?

    23 条回复    2017-11-23 10:47:07 +08:00
    akinoniku
        1
    akinoniku  
       2017-03-07 11:44:31 +08:00
    是一种风格,并不是强制性的,其实还蛮灵活,因为永远没有最佳实践。。

    rest 成功与否一般用 http status 表示。但如果你非要说你那也是 restful ,我觉得也是 ok 的
    baiyi
        2
    baiyi  
       2017-03-07 11:50:02 +08:00
    http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

    这是我读过的 RESTful API 实践 最好的一篇文章, 也是之前的 RESTful 讨论帖子中有 V 友贴出的.

    如果楼主想了解下区别的话 对比文章中的例子,与说明,能够很好的理解
    Kilerd
        3
    Kilerd  
       2017-03-07 11:56:10 +08:00   ❤️ 1
    如果用 REST 风格重写你这个借口的化 应该是这样的:

    POST http://www.test.com/comment {"uid": 1234, "content": "good"}

    btw , 你这里的 index.php 是什么鬼,不 rewrite 一下??
    ChefIsAwesome
        4
    ChefIsAwesome  
       2017-03-07 11:59:20 +08:00   ❤️ 1
    你觉得云里雾里,是因为你看到的都是怎么实现 restful 的文章。
    你要找的是一篇文章,告诉你 restful 能解决什么问题,别的方法为什么解决不好这个问题。然后思考你的工作有没有这些问题,要不要上 restful 解决这些问题。
    Ouyangan
        5
    Ouyangan  
       2017-03-07 13:15:58 +08:00
    我也一直在迷惑这个, 那么下面这种方式如何呢?

    user/insert
    user/select
    user/update
    user/delete
    user/list
    zoffy
        6
    zoffy  
       2017-03-07 14:07:11 +08:00
    就像 MVC 一样,是 software engineering 里的一种思想
    edison111cry
        7
    edison111cry  
    OP
       2017-03-07 14:16:10 +08:00
    @akinoniku
    多谢回复,但是看到楼下的回复说好像又不太像是一回事了
    edison111cry
        8
    edison111cry  
    OP
       2017-03-07 14:20:24 +08:00
    @Kilerd
    这个 index.php 只是示意一下。
    但是您写的 POST http://www.test.com/comment {"uid": 1234, "content": "good"}
    我还不是太能理解。
    因为我用的 THINKPHP 框架,所以 Comment 这个对应的是类, addComment 对应的是方法,如果要把这条 API 链接发给 APP 人员,让他们写在程序里调用的话,不应该还是要用
    http://www.test.com/index.php/Comment/addComment/uid/1234/content/good
    这程格式吗?
    ytmsdy
        9
    ytmsdy  
       2017-03-07 14:24:02 +08:00
    @Kilerd
    POST http://www.test.com/comment {"uid": 1234, "content": "good"}
    最后没要注意加 / 哦。。。要不然会报错的。。哈哈哈
    sparkle2015
        10
    sparkle2015  
       2017-03-07 14:39:25 +08:00
    @Kilerd @edison111cry
    其实更正确一点,应该是这样:
    POST http://www.test.com/comments {"content":"good"}
    comments 应该用复数,而 uid 我认为并不需要,因为,只有登录用户才可以评论,而登录用户的信息比如 token 应该放在每一个请求的 header 里。
    yongzhong
        11
    yongzhong  
       2017-03-07 14:52:14 +08:00
    可以参考谷歌的 API 设计指南 https://cloud.google.com/apis/design/
    edison111cry
        12
    edison111cry  
    OP
       2017-03-07 14:53:53 +08:00
    @baiyi
    多谢哈,刚刚粗略看完了,不过依然还是比较晕。
    如果能有更直接更简单的,比如就直接依照我用的例子里:
    http://www.test.com/index.php/Comment/addComment/uid/1234/content/good
    这种 THINKPHP 里给出一个例子,可能我就能豁然开朗了。哈哈
    ltux
        13
    ltux  
       2017-03-07 14:55:11 +08:00
    RESTful 是一种网站交互接口设计风格,并无官方标准,简单说它的要求就两条: 1 ,所有对资源操作的方式都用标准 http method 指定,比如 增删查改 分别对应 post 、 delete 、 get 、 put ,相应地,操作成功与否的信息也应该用标准的 http 响应码来表示,而非 http response body ; 2 ,所有的作用域信息都用 URI 指定。

    你用 get http://www.test.com/index.php/Comment/addComment/uid/1234/content/good 这种方式不是 RESTful ,因为虽然作用域信息是在 URI 里,但是对资源的操作方法 add 也放在 URI 里了, http method 跟真正的操作方法不对应,这种接口风格只能称为 RPC 。
    baiyi
        14
    baiyi  
       2017-03-07 15:05:19 +08:00
    @edison111cry #12

    唔...这种东西还是需要自己理解吧,直接给例子也不一定能对的上你的项目

    我在刚接触 RESTful 的时候查过好多资料,一点点的理解 REST 架构,当然了,到现在也不敢说完全理解

    这是我在学习后整理的一片博文.里面的[参考文章]有很多我当初学习是找到的资料,希望能对你有所帮助
    http://captainjack.me/2016/12/RESTful%20API%20%E5%AE%9E%E8%B7%B5/
    edison111cry
        15
    edison111cry  
    OP
       2017-03-07 15:07:04 +08:00
    @ltux
    非常感谢,经您这么一说,我大概明白了我的那个 API 接口不能称之为 RESTFUL API 了。
    我用 THINKPHP 来写的,但是怎么把我的这个接口改写成 restful api 还是有点晕。 55555
    yeyuexia
        16
    yeyuexia  
       2017-03-07 15:12:47 +08:00
    @Ouyangan
    user/insert users POST
    user/select users/{id} GET
    user/update users/{id} PUT
    user/delete users/{id} DLETE
    user/list users GET
    最基本的东西了 建议先去好好读读 restful 规范吧
    Ouyangan
        17
    Ouyangan  
       2017-03-07 15:18:23 +08:00
    @yeyuexia #16 十分感谢哈 , 我明白是利用 http 本身的方法来操作资源,但是我没想明白这样做有什么好处, 解决了什么问题.
    exherb
        18
    exherb  
       2017-03-07 15:21:02 +08:00
    传 uid 是不安全的,建议引入用户认证啊
    yeyuexia
        19
    yeyuexia  
       2017-03-07 15:21:23 +08:00
    @edison111cry restful 的前提是一个假定:所有的请求都是在处理资源 ,所以 uri 上都应该是名词,而动作则用 http 的 method 在表示 至于 path 的先后顺序 就有些类似面向对象里面设计的类的层级了
    添加比如商品的评论
    应该是 goods/comments POST user , content 信息应该传 body 而不应该放在 path 里面
    yeyuexia
        20
    yeyuexia  
       2017-03-07 15:24:14 +08:00
    @Ouyangan 其实他作为一个规范的最大好处就是前后端配合熟悉了之后,只需要去看 uri 就能知道是在做什么
    对于后端开发来说 还有一个好处就是做 restful 设计的时候 你会更多的考虑你数据结构的设计,让数据结构设计更合理。
    blackjar
        21
    blackjar  
       2017-03-07 16:04:32 +08:00
    JerryZhang
        22
    JerryZhang  
       2017-03-07 16:19:43 +08:00
    从游戏服务器转到 Web 服务器,用 Django 给 App 提供 API , 自己琢磨了一下和 App 定了交互规则,用了几个月碰到别人说 RESTFUL ,后来一看和我自己定的规则大同小异。

    软件工程中的规则 /模式 /规范,都是为了人与人之间交互使用的,不同的规则会影响协作模式,进而影响效率。所以就有人抽象出来了 RESTFUL 这样的东西,还有设计模式,编码规范等等。

    但要知道的是,他们都是辅助,关键还是要看你们团队之间的共识,如果你们一致觉得某个规则是好的,是适合你们的,用就是了。
    fuckgfwfuckgfw
        23
    fuckgfwfuckgfw  
       2017-11-23 10:47:07 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3301 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:38 · PVG 08:38 · LAX 17:38 · JFK 20:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.