关于 RESTFUL API,求解释 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edison111cry
V2EX    问与答

关于 RESTFUL API,求解释

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

    看大家讨论 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 本身的方法来操作资源,但是我没想明白这样做有什么好处, 解决了什么问题.
    PG6G92lJb7qCYHRt
        18
    PG6G92lJb7qCYHRt  
       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     Solana     2934 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:45 PVG 21:45 LAX 05:45 JFK 08:45
    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