※ 本文為 terievv 轉寄自 ptt.cc 更新時間: 2019-03-14 01:20:18
看板 Soft_Job
作者 標題 Re: [請益] 所以,到底什麼是RESTful API?
時間 Mon Mar 11 21:26:25 2019
很多人以為
/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沒明確指示做法
這是我個人解讀
覺得有誤也請指正了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.82.1.106
※ 文章代碼(AID): #1SXc846v (Soft_Job)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1552310788.A.1B9.html
※ 同主題文章:
● 03-11 21:26 ■ Re: [請益] 所以,到底什麼是RESTful API?
03-12 14:14 ■ Re: [請益] 所以,到底什麼是RESTful API?
03-12 15:56 ■ Re: [請益] 所以,到底什麼是RESTful API?
推 : 老實說開頭兩例我還滿不喜歡 /users/1 這種風格的1F 03/11 21:45
→ : 奇怪. 難道有人覺得Get(User, 1)是很直覺的寫法嗎?2F 03/11 21:45
→ : 因為這局限了查詢的層次,我要找就一定要 /users/1 底下找3F 03/11 21:46
→ : 任何人寫程式都是覺得 User.get(1) 比較直覺吧? 為什麼4F 03/11 21:46
→ : 變HTTP時就會自動想要"RESTful"?
→ : 說白了就是HTTP協定本來就不是為了API設計,只是方便易
→ : 用所以流行而已. 又"剛好" HTTP methods 對應了最常見的
→ : 幾種操作, 僅此而已. 沒必要把URI硬套"資源導向設計"
→ : 變HTTP時就會自動想要"RESTful"?
→ : 說白了就是HTTP協定本來就不是為了API設計,只是方便易
→ : 用所以流行而已. 又"剛好" HTTP methods 對應了最常見的
→ : 幾種操作, 僅此而已. 沒必要把URI硬套"資源導向設計"
推 : 不知何時開始,Web變的很重視 router 這種東西9F 03/11 21:51
放心啦以後剩下/graphQL而已XD
※ 編輯: ripple0129 (115.82.1.106), 03/11/2019 21:53:30
→ : 寫 users/1 變的像寫地址一樣,縣市/鄉鎮市區/路/段/號/樓10F 03/11 21:52
→ : 可是你還是要看 Doc 才能操作 API
→ : 不然你不知道每一層 / 底下代表的是什麼意思
→ : 這樣跟傳統 ?search 看 Doc 查變數名稱沒啥不同
→ : 可是你還是要看 Doc 才能操作 API
→ : 不然你不知道每一層 / 底下代表的是什麼意思
→ : 這樣跟傳統 ?search 看 Doc 查變數名稱沒啥不同
→ : 像你舉的例子 /user/group/1, 到底是 "user之下的group"14F 03/11 21:54
→ : 還是 "在group1裡的user"? 1-1, 1-n, n-1, n-n 的關係跟
→ : 本無法表達, 最後還不是要查doc. 既然都要查doc, 寫成
→ : /get_user_by_group/1 又有何防? 還更加清楚
→ : 還是 "在group1裡的user"? 1-1, 1-n, n-1, n-n 的關係跟
→ : 本無法表達, 最後還不是要查doc. 既然都要查doc, 寫成
→ : /get_user_by_group/1 又有何防? 還更加清楚
→ : 總覺得可能跟物件導向習慣一路 .下去還是 -> 指過去一樣吧18F 03/11 21:56
推 : graphQL 讓我想到乾脆把整串JSON base64丟來丟去的日子
推 : graphQL 讓我想到乾脆把整串JSON base64丟來丟去的日子
→ : graphQL有spec,SAOP,JSON-RPC,XML-RPC都是協定(有spec)20F 03/11 22:09
→ : REST沒有spec, 就是風格建議而已, 為什麼? 因為定出來就
→ : 不夠簡單了.
→ : REST沒有spec, 就是風格建議而已, 為什麼? 因為定出來就
→ : 不夠簡單了.
推 : 我比較喜歡 mov je23F 03/11 22:11
→ : ..舉例錯誤呀 是/groups/{groupId}/users24F 03/11 22:40
→ : /get_user_by_group/1 是很糟糕的設計,而且使用 HA25F 03/12 05:51
→ : TEOAS 可以減少頻繁查 doc
→ : TEOAS 可以減少頻繁查 doc
推 : 如果把session存在另一台redis,這樣算不算無狀態27F 03/12 08:14
→ : 頭一次看過有人用命名風格定義RESTful28F 03/12 11:38
推 : 請問大家何時使用單數或複數? 例如 /users 是用複數29F 03/12 12:24
→ : 但/users/1/friends 是否用單數比較合理 /user/1/fri
→ : ends
推 : 另一個問題是 batch api 就是允許一次 POST jsonArray
→ : 多筆資料 要怎麼突顯出來? 例如 /users/batch 或是 /
→ : users 然後再多描述要傳 jsonarray 此外如果習慣用
→ : 複數 是否會有人以為可以 POST 多筆資料?
推 : 最後一個問題 當有多個動作修改某個資源時 但卻只有一
→ : 個 PUT 可以表達時 是否只能在 URL 標示動詞? 或是有
→ : 更好的作法?
→ : 但/users/1/friends 是否用單數比較合理 /user/1/fri
→ : ends
推 : 另一個問題是 batch api 就是允許一次 POST jsonArray
→ : 多筆資料 要怎麼突顯出來? 例如 /users/batch 或是 /
→ : users 然後再多描述要傳 jsonarray 此外如果習慣用
→ : 複數 是否會有人以為可以 POST 多筆資料?
推 : 最後一個問題 當有多個動作修改某個資源時 但卻只有一
→ : 個 PUT 可以表達時 是否只能在 URL 標示動詞? 或是有
→ : 更好的作法?
推 : 先推這篇有比較提到 pattern 了39F 03/12 13:27
→ : 樓上說的單複數問題 URL 是資源定址在 RESTful 正規化為
→ : collections/element 的形式所以你是在 users 集合裏新增
→ : users/1 則是集合中的某單一資源 是合語意的
→ : 樓上說的單複數問題 URL 是資源定址在 RESTful 正規化為
→ : collections/element 的形式所以你是在 users 集合裏新增
→ : users/1 則是集合中的某單一資源 是合語意的
推 : 我自己都是用複數 但有同事問我上面這幾個問題 我不43F 03/12 13:37
→ : 知如何解釋比較好 主要是 /users/1/friends 為何不是
→ : 單數? 畢竟只是針對 user 1 這1個人的朋友做操作
推 : 雖然大家對Restful 風格有一些共識了 但細節上還是會
→ : 有人有不同的想法
細節本來就沒有嚴謹定義了→ : 知如何解釋比較好 主要是 /users/1/friends 為何不是
→ : 單數? 畢竟只是針對 user 1 這1個人的朋友做操作
推 : 雖然大家對Restful 風格有一些共識了 但細節上還是會
→ : 有人有不同的想法
只是convention 大家都用複數
你要用單數也沒人可以說錯
但這個範例我個人覺得friends是複數啊
users/1的朋友們
users/1/friends/2這樣才覺得是單數
※ 編輯: ripple0129 (115.82.1.106), 03/12/2019 13:51:34
→ : 就只是你跟你同事腦袋轉不過來而已 你可以google沒s的少48F 03/12 13:50
→ : friends是複數沒錯 我指的是users是否應該是單數 user49F 03/12 13:57
→ : 我後來是跟他說 我看 Web API: the good parts 這本
→ : 書 大多數人用複數 但我覺得用多數法則的理由壓人是否
→ : 會讓人不服氣
→ : 我後來是跟他說 我看 Web API: the good parts 這本
→ : 書 大多數人用複數 但我覺得用多數法則的理由壓人是否
→ : 會讓人不服氣
→ : flyman大 因為/users/傳回多筆 /users/1 傳回一個user53F 03/12 15:35
→ : /users/1/something 就是根據這個user再往下取資料
→ : 如果這個something是一個集合 就用複數
→ : 因為這樣比較符合語意不單純是多數人使用的問題
→ : 就好像一個json描述的資源 , 集合通常用複數命名
→ : /users/1/something 就是根據這個user再往下取資料
→ : 如果這個something是一個集合 就用複數
→ : 因為這樣比較符合語意不單純是多數人使用的問題
→ : 就好像一個json描述的資源 , 集合通常用複數命名
推 : 爭這個就好像回字有四種寫法一樣58F 03/12 16:07
--
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 96
作者 ripple0129 的最新發文:
- 14F 5推
- 42F 13推
- 一年半前在股版談比特幣只有噓而已 現在已經是可以當串文了 當然再一年之後的熊市 出現比特幣文又是只有噓而已 很多人認不清幣的本質 幣的本質背後就是信仰 美元能成為信仰是因為武力 而比特幣是因為去中心 …166F 35推 3噓
- 25F 8推
- 19F 5推
點此顯示更多發文記錄
回列表(←)
分享