0
我正在學習REST API設計中涉及的最佳實踐,並編寫了一個處理GET/cities HTTP/1.1查詢的函數。REST API設計的GET方法中的HTTP狀態代碼
該函數包含的城市是一個結構數組,其中包含城市名稱,多個城市的城市代碼。
下面是代碼
func FindCitiesHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
if len(cities) == 0 {
w.WriteHeader(404)
return
}
if err := json.NewEncoder(w).Encode(cities); err != nil {
/* what to do here? */
}
w.WriteHeader(200)
}
現在,當我開始思考這個功能可能出現的結果。我發現了這些情況。
它成功返回所有城市作爲JSON響應。所以我返回200 http狀態。
城市列表爲空。所以沒有什麼可以回報的。所以我返回404(資源未找到)
它即將返回所有城市的JSON響應,但在JSON編碼期間出錯。現在我很困惑,我該如何處理這種情況。
我的意思是,你如何傳達正確信息給用戶,如果
- 如果你的業務/應用邏輯有一些錯誤/異常。
- 如果數據訪問邏輯發現一些問題。 (說連接數據庫不可達)
你們可以請你幫我建議你在這些情況下遵循的最佳做法?
那麼,對於服務器端的問題,你有5xy狀態代碼。關於404如果len(城市)== 0:這看起來不對。 404是「找不到資源」,但是資源_was_ _found_,只是發生該資源不包含城市。想想「沒有這樣的文件'foobar'」之間的區別。「和「這是文件'foobar'的內容(但foobar恰好是空的)。」 – Volker
如果請求已成功處理,但響應爲空,則應使用響應代碼204:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success –
您應該使用[http常量](https:// golang .org/pkg/net/http /#pkg-constants)而不是返回碼。例如:'w.WriteHeader(http.StatusOK)' – apxp