Re: [请益] 所以,到底什么是RESTful API?

楼主: ripple0129 (perry tsai)   2019-03-11 21:26:25
很多人以为
/users?id=1
改成
/users/1
就是Restful了
Restful是个风格
不过不是改个route, controller样貌就叫Restful
以前自己在看的时候
比较难理解的个人觉得有两个地方
第一就是资源点观念
先来讲讲上面的观念差异
/users?id=1
用资源点的观念来看
就是资源点在/users
我要从users中query出id是1的user
所以说不是有parameter的就不是Restful
一样能用资源点的观念解释
/users/1
这个1代表什么自行定义吧
如果1代表的是group的话呢
users/1就是users被定义于group 1的资源点
可能也是多数也可以再用parameter query它
就像users/1?age<10
资源点就是这样的概念
所以不是单纯route的样貌就决定是不是Restful
当然多数我们在设计时还是习惯会多个提醒
弄成这样/users/group/1
照这样讲好像怎样解释都行的通?
当然不是这样子
资源点要是名词
当有route被设计成
/get-user-password?account=abc
这样的设计就偏离Restful了
因为带有动词的意味
第二个比较难理解就是无状态
无状态的定义就是你每次的request
都跟你之前的request无关
说的这么复杂直接讲白点就是
不要用session啦
过往设计可能会有第一次request
存点资料在session
下次request可能拿来用
不过这就背离Restful啦
而无状态的好处是很明显的
因为没有状态server只是取得资源点的地方
所以可以轻松的达成
多台Server提供服务
你每次的request连接到哪一台都没差
要判断你的设计是不是无状态的
单纯就考量这一点即可
能否Server多开后
同一使用者的Request
就算轮著一台一台戳也不会有问题
其他的观念
个人觉得都算容易理解也不用赘述了
当然由于Restful没明确指示做法
这是我个人解读
觉得有误也请指正了
作者: shter (飞梭之影)   2019-03-11 21:45:00
老实说开头两例我还满不喜欢 /users/1 这种风格的
作者: bibo9901 (function(){})()   2019-03-11 21:45:00
奇怪. 难道有人觉得Get(User, 1)是很直觉的写法吗?
作者: shter (飞梭之影)   2019-03-11 21:46:00
因为这局限了查询的层次,我要找就一定要 /users/1 底下找
作者: bibo9901 (function(){})()   2019-03-11 21:46:00
任何人写程式都是觉得 User.get(1) 比较直觉吧? 为什么变HTTP时就会自动想要"RESTful"?说白了就是HTTP协定本来就不是为了API设计,只是方便易用所以流行而已. 又"刚好" HTTP methods 对应了最常见的几种操作, 仅此而已. 没必要把URI硬套"资源导向设计"
作者: shter (飞梭之影)   2019-03-11 21:51:00
不知何时开始,Web变的很重视 router 这种东西写 users/1 变的像写地址一样,县市/乡镇市区/路/段/号/楼可是你还是要看 Doc 才能操作 API不然你不知道每一层 / 底下代表的是什么意思这样跟传统 ?search 看 Doc 查变量名称没啥不同
作者: bibo9901 (function(){})()   2019-03-11 21:54:00
像你举的例子 /user/group/1, 到底是 "user之下的group"还是 "在group1里的user"? 1-1, 1-n, n-1, n-n 的关系跟本无法表达, 最后还不是要查doc. 既然都要查doc, 写成/get_user_by_group/1 又有何防? 还更加清楚
作者: shter (飞梭之影)   2019-03-11 21:56:00
总觉得可能跟物件导向习惯一路 .下去还是 -> 指过去一样吧graphQL 让我想到干脆把整串JSON base64丢来丢去的日子
作者: bibo9901 (function(){})()   2019-03-11 22:09:00
graphQL有spec,SAOP,JSON-RPC,XML-RPC都是协定(有spec)REST没有spec, 就是风格建议而已, 为什么? 因为定出来就不够简单了.
作者: longlongint (华哥尔)   2019-03-11 22:11:00
我比较喜欢 mov je
作者: alan3100 (BOSS)   2019-03-11 22:40:00
..举例错误呀 是/groups/{groupId}/users
作者: CaptainTeemo (提摩队长)   2019-03-12 05:51:00
/get_user_by_group/1 是很糟糕的设计,而且使用 HATEOAS 可以减少频繁查 doc
作者: goodblessu (BTRFOO)   2019-03-12 08:14:00
如果把session存在另一台redis,这样算不算无状态
作者: SuM0m0 (Part Time Player)   2019-03-12 11:38:00
头一次看过有人用命名风格定义RESTful
作者: csieflyman (风之骄子)   2019-03-12 12:24:00
请问大家何时使用单数或复数? 例如 /users 是用复数但/users/1/friends 是否用单数比较合理 /user/1/friends另一个问题是 batch api 就是允许一次 POST jsonArray多笔资料 要怎么突显出来? 例如 /users/batch 或是 /users 然后再多描述要传 jsonarray 此外如果习惯用复数 是否会有人以为可以 POST 多笔资料?最后一个问题 当有多个动作修改某个资源时 但却只有一个 PUT 可以表达时 是否只能在 URL 标示动词? 或是有更好的作法?
作者: MangoTW (不在线上)   2019-03-12 13:27:00
先推这篇有比较提到 pattern 了楼上说的单复数问题 URL 是资源寻址在 RESTful 正规化为collections/element 的形式所以你是在 users 集合里新增users/1 则是集合中的某单一资源 是合语意的
作者: csieflyman (风之骄子)   2019-03-12 13:37:00
我自己都是用复数 但有同事问我上面这几个问题 我不知如何解释比较好 主要是 /users/1/friends 为何不是单数? 毕竟只是针对 user 1 这1个人的朋友做操作虽然大家对Restful 风格有一些共识了 但细节上还是会有人有不同的想法
作者: alan3100 (BOSS)   2019-03-12 13:50:00
就只是你跟你同事脑袋转不过来而已 你可以google没s的少
作者: csieflyman (风之骄子)   2019-03-12 13:57:00
friends是复数没错 我指的是users是否应该是单数 user我后来是跟他说 我看 Web API: the good parts 这本书 大多数人用复数 但我觉得用多数法则的理由压人是否会让人不服气
作者: brucetu (sec)   2019-03-12 15:35:00
flyman大 因为/users/传回多笔 /users/1 传回一个user/users/1/something 就是根据这个user再往下取资料如果这个something是一个集合 就用复数因为这样比较符合语意不单纯是多数人使用的问题就好像一个json描述的资源 , 集合通常用复数命名
作者: bibo9901 (function(){})()   2019-03-12 16:07:00
争这个就好像回字有四种写法一样
作者: ku399999   2019-03-14 09:40:00
一般用users/1 我觉得一来表示对这操作id是required,二来明确表示整个系统只会有一个id=1的item
作者: infixman (松下问童子)   2019-03-19 07:25:00
user们的1号的friend们的1号既然是“们”,加个s不是理所当然?

Links booklink

Contact Us: admin [ a t ] ucptt.com