Soft_Job 板


LINE

很多人以為 /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沒明確指示做法 這是我個人解讀 覺得有誤也請指正了 --
QR Code



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.82.1.106
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1552310788.A.1B9.html
1F:推 shter: 老實說開頭兩例我還滿不喜歡 /users/1 這種風格的03/11 21:45
2F:→ bibo9901: 奇怪. 難道有人覺得Get(User, 1)是很直覺的寫法嗎?03/11 21:45
3F:→ shter: 因為這局限了查詢的層次,我要找就一定要 /users/1 底下找03/11 21:46
4F:→ bibo9901: 任何人寫程式都是覺得 User.get(1) 比較直覺吧? 為什麼03/11 21:46
5F:→ bibo9901: 變HTTP時就會自動想要"RESTful"?03/11 21:46
6F:→ bibo9901: 說白了就是HTTP協定本來就不是為了API設計,只是方便易03/11 21:47
7F:→ bibo9901: 用所以流行而已. 又"剛好" HTTP methods 對應了最常見的03/11 21:48
8F:→ bibo9901: 幾種操作, 僅此而已. 沒必要把URI硬套"資源導向設計"03/11 21:49
9F:推 shter: 不知何時開始,Web變的很重視 router 這種東西03/11 21:51
放心啦 以後剩下/graphQL而已XD ※ 編輯: ripple0129 (115.82.1.106), 03/11/2019 21:53:30
10F:→ shter: 寫 users/1 變的像寫地址一樣,縣市/鄉鎮市區/路/段/號/樓03/11 21:52
11F:→ shter: 可是你還是要看 Doc 才能操作 API03/11 21:53
12F:→ shter: 不然你不知道每一層 / 底下代表的是什麼意思03/11 21:54
13F:→ shter: 這樣跟傳統 ?search 看 Doc 查變數名稱沒啥不同03/11 21:54
14F:→ bibo9901: 像你舉的例子 /user/group/1, 到底是 "user之下的group"03/11 21:54
15F:→ bibo9901: 還是 "在group1裡的user"? 1-1, 1-n, n-1, n-n 的關係跟03/11 21:55
16F:→ bibo9901: 本無法表達, 最後還不是要查doc. 既然都要查doc, 寫成03/11 21:55
17F:→ bibo9901: /get_user_by_group/1 又有何防? 還更加清楚03/11 21:56
18F:→ shter: 總覺得可能跟物件導向習慣一路 .下去還是 -> 指過去一樣吧03/11 21:56
19F:推 shter: graphQL 讓我想到乾脆把整串JSON base64丟來丟去的日子 03/11 22:03
20F:→ bibo9901: graphQL有spec,SAOP,JSON-RPC,XML-RPC都是協定(有spec) 03/11 22:09
21F:→ bibo9901: REST沒有spec, 就是風格建議而已, 為什麼? 因為定出來就 03/11 22:09
22F:→ bibo9901: 不夠簡單了. 03/11 22:10
23F:推 longlongint: 我比較喜歡 mov je 03/11 22:11
24F:→ alan3100: ..舉例錯誤呀 是/groups/{groupId}/users 03/11 22:40
25F:→ CaptainTeemo: /get_user_by_group/1 是很糟糕的設計,而且使用 HA 03/12 05:51
26F:→ CaptainTeemo: TEOAS 可以減少頻繁查 doc 03/12 05:51
27F:推 goodblessu: 如果把session存在另一台redis,這樣算不算無狀態 03/12 08:14
28F:→ SuM0m0: 頭一次看過有人用命名風格定義RESTful 03/12 11:38
29F:推 csieflyman: 請問大家何時使用單數或複數? 例如 /users 是用複數03/12 12:24
30F:→ csieflyman: 但/users/1/friends 是否用單數比較合理 /user/1/fri03/12 12:24
31F:→ csieflyman: ends03/12 12:24
32F:推 csieflyman: 另一個問題是 batch api 就是允許一次 POST jsonArray03/12 12:32
33F:→ csieflyman: 多筆資料 要怎麼突顯出來? 例如 /users/batch 或是 /03/12 12:32
34F:→ csieflyman: users 然後再多描述要傳 jsonarray 此外如果習慣用03/12 12:32
35F:→ csieflyman: 複數 是否會有人以為可以 POST 多筆資料?03/12 12:32
36F:推 csieflyman: 最後一個問題 當有多個動作修改某個資源時 但卻只有一03/12 12:39
37F:→ csieflyman: 個 PUT 可以表達時 是否只能在 URL 標示動詞? 或是有03/12 12:39
38F:→ csieflyman: 更好的作法?03/12 12:39
39F:推 MangoTW: 先推這篇有比較提到 pattern 了03/12 13:27
40F:→ MangoTW: 樓上說的單複數問題 URL 是資源定址在 RESTful 正規化為03/12 13:29
41F:→ MangoTW: collections/element 的形式所以你是在 users 集合裏新增 03/12 13:30
42F:→ MangoTW: users/1 則是集合中的某單一資源 是合語意的 03/12 13:31
43F:推 csieflyman: 我自己都是用複數 但有同事問我上面這幾個問題 我不 03/12 13:37
44F:→ csieflyman: 知如何解釋比較好 主要是 /users/1/friends 為何不是 03/12 13:37
45F:→ csieflyman: 單數? 畢竟只是針對 user 1 這1個人的朋友做操作 03/12 13:37
46F:推 csieflyman: 雖然大家對Restful 風格有一些共識了 但細節上還是會 03/12 13:40
47F:→ csieflyman: 有人有不同的想法 03/12 13:40
細節本來就沒有嚴謹定義了 只是convention 大家都用複數 你要用單數也沒人可以說錯 但這個範例我個人覺得friends是複數啊 users/1的朋友們 users/1/friends/2這樣才覺得是單數 ※ 編輯: ripple0129 (115.82.1.106), 03/12/2019 13:51:34
48F:→ alan3100: 就只是你跟你同事腦袋轉不過來而已 你可以google沒s的少 03/12 13:50
49F:→ csieflyman: friends是複數沒錯 我指的是users是否應該是單數 user 03/12 13:57
50F:→ csieflyman: 我後來是跟他說 我看 Web API: the good parts 這本 03/12 14:01
51F:→ csieflyman: 書 大多數人用複數 但我覺得用多數法則的理由壓人是否 03/12 14:01
52F:→ csieflyman: 會讓人不服氣 03/12 14:01
53F:→ brucetu: flyman大 因為/users/傳回多筆 /users/1 傳回一個user 03/12 15:35
54F:→ brucetu: /users/1/something 就是根據這個user再往下取資料 03/12 15:35
55F:→ brucetu: 如果這個something是一個集合 就用複數 03/12 15:36
56F:→ brucetu: 因為這樣比較符合語意不單純是多數人使用的問題 03/12 15:36
57F:→ brucetu: 就好像一個json描述的資源 , 集合通常用複數命名 03/12 15:37
58F:推 bibo9901: 爭這個就好像回字有四種寫法一樣 03/12 16:07
59F:→ ku399999: 一般用users/1 我覺得一來表示對這操作id是required,二 03/14 09:40
60F:→ ku399999: 來明確表示整個系統只會有一個id=1的item 03/14 09:40
61F:→ infixman: user們的1號的friend們的1號 03/19 07:25
62F:→ infixman: 既然是“們”,加個s不是理所當然? 03/19 07:26







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP