在處理請求的時候,並非每次都能正確處理完請求,
有可能因為某些原因連不到資料庫,或是程式寫錯導致出現bug,
更或者是使用者帶進來的參數錯誤,導致處理上出現錯誤,
在這種情況下,就必須回應錯誤訊息給請求端,不然對方可能會不知道發生什麼事。
當程式遇到錯誤時,服務會需要提供錯誤訊息,讓使用者知道發生什麼事,
通常格式會跟正常回應不同,以防止使用者將其當成正常回應去處理。
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("error, take user fail"))
}
但是這種方式會讓使用者必須寫一堆判斷式,去判斷這個回應到底是不是正確的,
這時最好有個標的讓使用者判定是否為錯誤,因此會建議回傳以json格式回傳。
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
json.NewEncoder(w).Encode(struct {
Error interface{} `json:"error"`
}{data})
return
這樣當使用者發現有"error"這個key,就代表這次回來的是錯誤訊息。
HTTP Status Code,用來表明一個HTTP請求是否完成的代碼,基本分為以下五類:
一般正常回應的情況下,會回傳200(OK)代表成功,
而伺服器出現錯誤時,例如資料庫連不上,則是回應500(Internal Server Error),
代表伺服器出現未知或無法處理的錯誤,
常常聽到的404(not found)也是一種HTTP Status Code,
代表找不到請求的資源,其他相關的HTTP Status Code就麻煩再自行看RFC 7231內的規範。
那麼這個狀態碼要如何寫到回應內呢,方法也很簡單:
w.WriteHeader(httpStatus)
這樣就可以把狀態碼寫入回應內了。
對於認為要把狀態碼跟錯誤訊息json整合起來感到麻煩的人,這邊介紹一個好用的套件。
restresp
使用起來非常容易,這邊用官方範例示範:
type customError struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
func (c *customError) Error() string {
return c.Msg
}
func testHandler(w http.ResponseWriter, r *http.Request) {
d := &customError{5, "wtf"}
restresp.Write(w, d, 200)
}
將要回傳的資料放入後,他會依照狀態碼判斷是否加上"error"或是"success"的key,
並自動轉成json格式,讓你不用寫判斷式去分辨是否為錯誤。