2017-02-28 90 views
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)  

}

現在,當我開始思考這個功能可能出現的結果。我發現了這些情況。

  1. 它成功返回所有城市作爲JSON響應。所以我返回200 http狀態。

  2. 城市列表爲空。所以沒有什麼可以回報的。所以我返回404(資源未找到)

  3. 它即將返回所有城市的JSON響應,但在JSON編碼期間出錯。現在我很困惑,我該如何處理這種情況。

我的意思是,你如何傳達正確信息給用戶,如果

  1. 如果你的業務/應用邏輯有一些錯誤/異常。
  2. 如果數據訪問邏輯發現一些問題。 (說連接數據庫不可達)

你們可以請你幫我建議你在這些情況下遵循的最佳做法?

+1

那麼,對於服務器端的問題,你有5xy狀態代碼。關於404如果len(城市)== 0:這看起來不對。 404是「找不到資源」,但是資源_was_ _found_,只是發生該資源不包含城市。想想「沒有這樣的文件'foobar'」之間的區別。「和「這是文件'foobar'的內容(但foobar恰好是空的)。」 – Volker

+0

如果請求已成功處理,但響應爲空,則應使用響應代碼204:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success –

+0

您應該使用[http常量](https:// golang .org/pkg/net/http /#pkg-constants)而不是返回碼。例如:'w.WriteHeader(http.StatusOK)' – apxp

回答

1
  1. 200是正確的
  2. 404可能是正確;城市列表可以是空的,並且仍然存在。 (認爲​​:0長度的數組仍然是一個數組)。您應該返回200.如果服務器上不存在城市列表,則只會返回404(換句話說,您的API可能永遠不會發生這種情況)。
  3. 如果遇到一個內部服務器錯誤,如與編組JSON,你應該返回一個內部服務器錯誤,狀態500