PTT推薦

Re: [討論] API沒資料,回200還是404比較好

看板Soft_Job標題Re: [討論] API沒資料,回200還是404比較好作者
yfr
()
時間推噓13 推:13 噓:0 →:32

雖然我不是微軟派的,但是不得不說他們文件寫得真是認真
https://docs.microsoft.com/zh-tw/azure/architecture/best-practices/api-design

好入手,廣度,深度也都有一定程度的水準

---

(感謝ssccg提醒,我更正一下內容跟context
我覺得原文並沒有把case列清楚
仔細想想我覺得大家可能都講對,只是想的東西沒對齊,我就獻醜列了一下
搞不好有人可以補充?

* GET {schema}://{host}:{port}/api/v1.0/members
1. members 資料為空
2. 預設的 page, size 搜尋結果為空陣列
3. 沒有這個 endpoint

* GET {schema}://{host}:{port}/api/v1.0/members/{uuid}
4. 沒有找到對應 uuid 的 member

* GET {schema}://{host}:{port}/api/v1.0/members/{uuid}/properties
5. properties 資料為空
6. 預設的 page, size 搜尋結果為空陣列
7. 沒有這個 endpoint

※ 引述《Geison (Angels)》之銘言:
: 我看有些是狀態碼200,空data
: 但有些又是做404,然後回個message 數據不存在之類的
: 這哪一種做法比較好?

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.229.68.76 (臺灣)
PTT 網址
※ 編輯: yfr (125.229.68.76 臺灣), 06/22/2022 15:18:22

ssccg06/22 15:28你貼的這篇就建議404啊

x51811danny06/22 16:01找不到資源!=沒資料

xup6y3ru0406/22 16:17這篇是說要回傳204

s06yji306/22 16:25用ID Get的時候找不到資源的情況是404吧

yfr06/22 16:30大家熱烈討論還蠻棒的,資源不存在跟沒有結果是細微的不同

smalldra06/22 16:36原來正解是204 ...

crazycy06/22 17:01照這篇就是要404阿...

crazycy06/22 17:02資源不存在不就是找不到資料(e.g.資料庫沒這筆資料)

crazycy06/22 17:03204是指說找到這筆資料,但是內容是空的

Romulus06/22 17:03這篇並不是說要回傳204

Romulus06/22 17:03「未包含任何 respose 主體」並不是「未包含任何資料」

iterator06/22 17:04for example, a search operation yielding no matches

iterator06/22 17:04might be implemented with this behavior.

Romulus06/22 17:05喔沒事 我切到英文版了 當我沒說(

Romulus06/22 17:05這篇建議用204

iterator06/22 17:05不過我覺得是如果想要回傳是 {} 空陣列, 那就是 200

iterator06/22 17:06如果要直接表示沒有要回傳的東西, 就用 204

Romulus06/22 17:07我個人不建議204的原因是,要是客戶端一律把回傳值先拿

Romulus06/22 17:07去parse成json,那204或200不帶訊息都會出錯

s06yji306/22 17:11客戶一律parse json那是客戶不看使用說明的問題?

s06yji306/22 17:12GetById和search應該是不同的操作

ssccg06/22 17:15search operation和resource是兩回事

Romulus06/22 17:17你可以說是客戶的問題 你也可以減少客戶的犯錯空間

ssccg06/22 17:17什麼叫做resource,什麼叫operation上面的段落有寫

ssccg06/22 17:21有些實作沒辦法對應成資源的,可以把這種「非資源」的作業

ssccg06/22 17:21公開成虛擬資源,如/add?operand1=99&operand2=1

ssccg06/22 17:22簡單說, /名詞/{id} 這種找不到應該用404

ssccg06/22 17:22動詞?參數={value1}&參數={value2} 這種才是找不到時可以用

ssccg06/22 17:23204的

Hsins06/22 17:25承樓上說的,要根據 RESTful 的設計應該盡量避免 URL 帶有

Hsins06/22 17:25動詞的操作。可以在頁面的 route 上出現 login,但呼叫後端

Hsins06/22 17:25時,登入的操作是要獲取 resource(以這種情景通常資源會命

Hsins06/22 17:25名為 session

ssccg06/22 17:27更正一下,應該說作業結果是沒結果時用204,找不到還是404

s06yji306/22 17:27這麼明確的東西我不覺得是減少客戶犯錯空間。

Jichang06/22 18:17404 無法表達是網址錯 還是沒資源

謝謝你們,我補充了一下context

※ 編輯: yfr (42.72.84.243 臺灣), 06/22/2022 18:59:09

qoo456alex06/22 20:39用path parameter 的方式就回404,不是的話就用body回

qoo456alex06/22 20:39空array 然後200

DrTech06/23 08:30不懂的人去看國際標準: RFC2616。4xx開頭是 error 。2xx

DrTech06/23 08:30開頭是 Info。

Hsins06/23 08:33要看也是看 2014 後更新調整的 RFC7231,這個版本才把 REST

Hsins06/23 08:34風格考慮進去,敘述中多了對表現層(representation)的解

Hsins06/23 08:34

Romulus06/23 09:24其實就在這個月出了RFC9110 XD

Hsins06/23 09:25RFC9110 針對 Status Code 的敘述跟 RFC7231 沒有太多差異