: 推 rollr: 回404的可以 fired 了 06/22 19:54 : → moom50302: 回404來亂的嗎? 06/22 20:45 嗯,我想兩位的建議可以寄信向 GitHub 和 Atlassian 這兩間公司說明一下,或許可以 幫他們團隊縮減人力。 當查詢資源不存在時返回 HTTP Code 404: https://i.imgur.com/67gl9w8.png
https://i.imgur.com/Mysgpr4.png
[REF] https://docs.github.com/en/rest [REF] https://docs.atlassian.com/ConfluenceServer/rest/7.18.1/#-getNodeById --- 在往下展開之前,我必須說下面的內容是以 RESTful API 設計風格的角度去看待,實現 上還有其他的方式可以採用。 REST = Representational State Transfer ‧網路上的資源,透過 URI 與之對應 ‧資源可以有不同的表現形式,透過請求時 攜帶的 Content-Type/Accept 指定 ‧透過 HTTP 協議方法轉化資源狀態 在 RESTful 架構中,每一個 URI 對應一種 資源,所以設計上會避免路徑出現動詞(動 詞用以轉化資源狀態,以 HTTP 協議的方法 來對應),而以名詞呈現;加上資料庫中存 放資料通常為資料的集合,因此多採用複數 形式(多個用戶/多篇文章/多個倉庫…) --- 以 GitHub REST API (v3) 的設計來回應推 文中提到的幾個問題,舉例來說: [GET] /users 獲取使用者清單 [GET] /users/<USERNAME> 獲取指定使用者資訊 ‧如果 USERNAME 不存在,返回 404 [GET] /users/<USERNAME>/followers 獲取指定使用者的追蹤者 ‧如果 USERNAME 下沒有追蹤者 返回 200 與空陣列 --- 差異在於以 REST 設計時,倘若今天你要拿 到 USERNAME 去進行請求,會假定你已經知 道要拿這個使用者下面的資料了,如果是使 用者不存在,代表是 Client 的問題,企圖 存取沒有的資源,當然是 404。 而訪問指定 USERNAME 下面的追蹤者時,是 要獲取資源清單,所以這時的空陣列就是他 的清單,只是空無一人,並不是沒有清單, 自然是 200 表示請求成功。 至於有人問說返回 404 怎麼跟 API 不存在 作區別,其實從上述的範例看的出來,今天 的 <USERNAME> 相當於是查詢用的參數,訪 問這個資源的確不存在,查詢資源的 API的 確不存在,兩件事情都成立呀! 因為此時 REST 設計要告訴你的就是「路徑 不存在,路徑又對應資源,資源不存在」 --- 另外提一下推文有的一些謬誤: ‧HTTP Status Code 中的 4xx 代表客戶端 錯誤,而 5xx 才是伺服器錯誤,所以系 統錯誤更不該返回 404… ‧在 REST 中用 GET 拿資料,而 204 其實 代表的是「請求成功,但沒有 BODY」, 這個比較常用在 DELETE 操作… --- 順帶提一下,規範跟設計上是需要做取捨的 ,比如 GitHub 其中有一段關於授權認證的 敘述: 「Requests that require authentication will return 404 Not Found, instead of 403 Forbidden, in some places. This is to prevent the accidental leakage of private repositories to unauthorized users.」 當沒有授權的使用者去獲取倉庫清單時,即 使是沒有權限,也必須先考慮到隱私性所以 返回 404 而不是 403 避免私有倉庫被沒有 權限的人知道: > 沒有權限,但訪問 A 倉庫拿到 403 > 可以猜出有個私有倉庫 A > 但使用者其實不想讓人知道他有這個倉庫 -- ※ 發信站: 批踢踢實業坊(ptt-site.org.tw), 來自: 111.82.214.46 (臺灣) ※ 文章網址: https://ptt-site.org.tw/Soft_Job/M.1655905888.A.728
Soarwind: 推~ 很清楚, RESTful 是這樣 06/22 22:25
CMJ0121: 推 06/22 22:35
cip604: 推 06/22 22:59
yehzu: 推!認同此篇概念 06/22 23:03
lovdkkkk: 推 不過最後的 403 404 好像反了 06/22 23:05
T730733: 有沒有富二代要包養 06/22 23:05
devilkool: 推 06/22 23:22
justaID: 樓上,404 403 的例子應該沒有講反?先驗權限回403,缺 06/22 23:24
justaID: 乏權限的連資源是否存在都不該讓 hacker 直到很合理 06/22 23:24
justaID: *樓樓上06/22 23:24
justaID: *知道 (自動選字QQ06/22 23:25
FireStation: 身邊有朋友被包養06/22 23:25
justaID: 推這篇對 REST 描述得滿清楚06/22 23:26
viper9709: 推06/22 23:27
justaID: 我剛剛沒有注意 GitHub 原文那段,原來 GitHub in some06/22 23:47
justaID: places 沒權限時回404,我個人本來以為應該優先回 40306/22 23:47
justaID: 比較合理 (無論背後資源是否存在,都回 403 並不會讓 u06/22 23:47
Thobel: 亞洲最大包養平台上線了06/22 23:47
justaID: nauthorized user 知道資源到底在不在),推測也許考量06/22 23:47
justaID: 觀點是:看到 403,hacker 會覺得背後資源有可能存在,06/22 23:47
justaID: 而繼續找其他方法突破 auth;但看到 404 很大機率是資源06/22 23:47
justaID: 真的不存在,effort 取捨下會放棄 hack 這個資源,避免06/22 23:47
justaID: hack 半天一場空06/22 23:47
Reji: 這個包養網正妹好多 是真的嗎06/22 23:47
Y78: 推06/22 23:57
justaID: 謝謝原po的列舉解說,以 Github 的 case 來說確實卡到了 06/23 00:44
justaID: 公開倉庫 和私有倉庫 是同樣的 path pattern,無法在判 06/23 00:44
justaID: 斷倉庫是否存在前就先以 403 阻擋 06/23 00:44
genius945: 說得很清楚,推 06/23 01:10
Hathael: 真的有這麼多人在找包養 06/23 01:10
Romulus: GitHub不要說REST了,就連網頁介面照樣丟404 XD 06/23 01:23
YYYero: 推 06/23 01:43
LeoSW: 推這篇,寫得很清楚 06/23 08:15
DrTech: 原文搞錯了。重點不在查詢資源存在不存在。而是你認為Clie 06/23 08:34
DrTech: nt的Request行為,是正常還是預期外的error。4xx開頭是 er 06/23 08:34
yovroc: 有人可以分析一下包養平台的差異嗎 06/23 08:34
DrTech: ror 。2xx開頭是 Info。 06/23 08:34
DrTech: 請參考RFC2616。 06/23 08:34
zxc8787: 推 06/23 08:55
BBSealion: 讚讚 06/23 08:56
suibo: 推 06/23 09:37
helgalie: 那個包養網人最多XD 06/23 09:37
zxc6414189: 推 06/23 10:16
longlyeagle: nice nice 06/23 10:19
TheWhack: 原文那2位版友是在指API回空資料應該要用200而非404吧? 06/23 11:20
TheWhack: 就是對應到原po的"空無一人,並不是沒有清單"這項 06/23 11:20
alan3100: /users/<USERNAME> 已經指定user卻找不到是種錯誤回404 06/23 11:57
OREOMZA: 我妹上包養網被我發現= = 06/23 11:57
alan3100: /users/<USERNAME>/followers 沒有是一種正常情況回200 06/23 11:57
hegemon: 這個是萬年議題了...怎麼沒有人把204一起拉來參戰? 國外 06/23 12:42
hegemon: 都是200, 204, 404大亂鬥的 06/23 12:42
Romulus: 可是明明就有啊.204 06/23 13:13
lturtsamuel: 原文在問的不是你這個找不到user的狀況吧 比較像是有 06/23 13:37
punjab: 隔壁桌的人竟然在討論包養... 06/23 13:37
lturtsamuel: 這個user但他沒有repo 06/23 13:37
Hsins: 原 po 只有說沒資料吧? /users/<USERNAME> 當 USERNAME 06/23 13:45
Hsins: 不在資料庫中,也是沒資料... 06/23 13:46
TheWhack: 可能要釐清最原po的"沒資料",是指null,還是{}或[] ? 06/23 14:09
Hsins: 所以應該引導他去思考這件事情,而不是直接就說 404 或 200 06/23 14:48
sashare: 樓上是不是被包養 06/23 14:48
Hsins: 的直接方案,這個從那篇的推文跟我這篇回文,我有將情境和 06/23 14:49
Hsins: 前提敘述出來的 06/23 14:49
ssccg: 404和403的部分其實兩個都可以,只要統一即可 06/23 15:07
ssccg: 讓存在但沒權限和不存在兩個狀態無法分辨即可 06/23 15:08
ssccg: RFC 403的理由不一定要跟權限有關,而404也可以是故意隱藏 06/23 15:11
sijiex: 未看先猜這包養 06/23 15:11
ssccg: 當然如果網站有公開的部分,統一成404比較合理 06/23 15:13
davidsky: 下面寫得不錯但是上面酸他們沒必要 他們只用一行字要怎 06/23 17:00
davidsky: 怎麼表達404不該用在[] 06/23 17:00
davidsky: 而且我看原標題也會覺得再問array為空 單一資源沒有的話 06/23 17:01
davidsky: 不太可能會想用200 06/23 17:01
VLADINA: 一定又是這包養 06/23 17:01
Hsins: 這麼說吧,我看標題也會這麼認為,而且也同意這樣的狀況是 06/23 17:15
Hsins: 200 並回傳空值,但是看到文章內容,會提到 404 通常是與 R 06/23 17:15
Hsins: EST 風格的這種資源不存在混淆(不論是發文者或是他看到這 06/23 17:15
Hsins: 樣實作的那個人)。 06/23 17:15
Hsins: 推文的可以選擇回文,也可以選擇推多行文字。直接用一行字 06/23 17:18
odemagus: 包養平台不意外 06/23 17:18
Hsins: 不負責任地表達又說可以 fire 人,還真不知道是我比較酸還 06/23 17:18
Hsins: 是他們比較酸? 06/23 17:18
janbarry168: 推 06/23 19:17
zegas: 推 06/23 19:55
wwfwwf: 推 06/23 20:57
yes500: 覺得包養網EY嗎 06/23 20:57
DrTech: 原文拿Restful慣例(非國際標準),來戰國際標準。搞錯優先 06/23 21:49
DrTech: 權啦。 06/23 21:49
iamOsaka: 推 06/23 22:09
lovdkkkk: 倒是講到個點了,之前就想回標準是方便大家對齊用的,不 06/23 23:02
lovdkkkk: 是權威鐵律,如果自己用標準感覺不方便可以不用符合,如 06/23 23:03
alexantiy: 包養網站葉配啦 06/23 23:03
lovdkkkk: 果大家都照標準走都覺得不方便也可以修 06/23 23:03
lovdkkkk: 看到修文講到回一下 (飄走) 06/23 23:05
Hsins: 像是 Meta 家的就沒有很依照這篇提的 REST 風格(即使他們 06/23 23:07
Hsins: 宣稱是 REST API) 06/23 23:09
SMMIT: 推 詳細 06/23 23:24
sowrey: 記者收了包養網多少啦 06/23 23:24
mTwTm: 我覺得其實拿 RFC 2616 的敘述來佐證 API 設計很奇怪,他 06/24 03:08
mTwTm: 當下主要目的就是設計給 hypermedia 資源的存取,只是後來 06/24 03:08
mTwTm: 有些人決定也沿用這個來當 API 的協定當然現在就漸漸變成 06/24 03:08
mTwTm: 常見的做法。就是因為後來才借用當然就需要一個 adapter 06/24 03:08
mTwTm: 雖然不一定要是 rest 但不考慮中間這層直接去引用 http 的 06/24 03:08
cw758: 包養真亂 06/24 03:08
mTwTm: 敘述我是覺得一定會因為文件資源跟資訊的目的不同而對不上 06/24 03:08
ssccg: RESTful的精神就是回歸hypermedia,而不是用cgi的角度在看 06/24 03:57
ssccg: 不管背後是個File system還是Web framework,URI呈現出來的 06/24 03:59
ssccg: 就是資源、就跟一個網址對應一個網頁都一樣 06/24 04:00
ssccg: 反過來說不把URI當資源而是API端點的話,根本不用分path 06/24 04:03
ludi: 演藝圈一堆包養好嗎 06/24 04:03
ssccg: 像一般RPC把要做什麼也都放在參數不是更單純不會有404? 06/24 04:07
ssccg: 就是在Web API多數分path有分GET、POST,有的時候用4xx有時 06/24 04:12
ssccg: 候又用body內自定義code,沒一個原則,才會有人提RESTful 06/24 04:14
ssccg: 用本來就存在、實作也大致符合標準的HTTP來當這原則 06/24 04:18
mTwTm: 我的意思就是怎麼樣都應該拿後期的 RFC 而不是 2616 06/24 12:30
peernut: 政治圈一堆包養好嗎 06/24 12:30
mTwTm: 也不是說一定要拿 RFC 但不能直接套用 2616 (回應科技博 06/24 12:31
mTwTm: 正是因為是不是從瀏覽器出發的這個差異所以看舊的 RFC 的 06/24 12:32
mTwTm: 時候要意識到當初他的設計不能用現代的方式自行解讀 06/24 12:32
fadeawaygod: 這篇才是正解,回200與204都是積非成是 06/24 15:07
Romulus: 我覺得MT是最被看破手腳的 大概可以想成他其他話題 06/24 16:26
xikimi: 有錢人一堆包養好嗎 06/24 16:26
Romulus: 很嗆可能也是用類似的一知半解就不知道在嗆什麼…… 06/24 16:26
mirror0227: 推 06/26 03:27