亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang http 服務器根據內容類型返回 html 或 json

Golang http 服務器根據內容類型返回 html 或 json

Go
智慧大石 2023-06-26 17:04:30
我正在嘗試使用 gorilla mux 在 Golang 中編寫簡單的 RESTful 應用程序。我編寫了一些處理程序,如下所示:func getUser(w http.ResponseWriter, r *http.Request) {    if r.Header.Get("Content-type") == "application/json" {        w.Header().Set("Content-Type", "application/json")        u, err := _getUser(r)        if err != nil {            http.NotFound(w, r)            return        }        json.NewEncoder(w).Encode(u) //asked for json, return json    } else {        w.Header().Set("Content-Type", "text/html")        u, err := _getUser(r)        if err != nil {            http.NotFound(w, r)            return        }        renderTemplate(w, "view", u) // asked for html, return html    }}func _getUser(r *http.Request) (*User, error) {    params := mux.Vars(r)    for _, u := range users {        if u.ID == params["id"] {            return &u, nil        }    }    return nil, errors.New("")}func main() {    router := mux.NewRouter()    router.HandleFunc("/v1/users/{id}", getUser).Methods("GET")}我在這里遇到的問題是我有很多重復。每個 CRUD 方法都必須檢查內容類型并返回 json 或 html。我想過寫一個閉包func htmlOrJSON(fn func(http.ResponseWriter, *http.Request) (interface {}, error), templateName string) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        if r.Header.Get("Content-type") == "application/json" {            w.Header().Set("Content-Type", "application/json")            result, err := fn(w, r)            if err != nil {                http.NotFound(w, r)                return            }            json.NewEncoder(w).Encode(result)        } else {            w.Header().Set("Content-Type", "text/html")            result, err := fn(w, r)            if err != nil {                http.NotFound(w, r)                return            }            renderTemplate(w, templateName, result)        }    }}// and use as:router.HandleFunc("/v1/users/{id}", htmlOrJSON(getUser, "view")).Methods("GET")刪除重復但看起來也不太好。誰能幫我使這段代碼更清晰嗎?
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

雖然這是一個代碼審查問題并且應該在 CodeReview 社區中,但我會嘗試回答它。


編寫一個處理 HTML 和 JSON 渲染的通用函數。即使您重復某些代碼,錯誤處理 IMO 也應該在每個處理程序上發生。它在那里更有意義,并使代碼更具可讀性和明確性。您很快就會發現還有其他錯誤需要特殊處理。


從邏輯上來說,大多數API都接受查詢參數http://api.com/user/1?fomtat=json。這更有意義,因為當客戶端接受多種內容類型時,您就會陷入困境。


const JSON = "application/json"


func getUser(w http.ResponseWriter, r *http.Request) {

    u, err := _getUser(r)

    if err != nil {

        http.NotFound(w, r)

        return

    }

    responseBody(u, r.Header.Get("Content-type"), &w)

}


func responseBody(u User, contentType string, w io.writer) {

    switch contentType {

    case JSON:

        w.Header().Set("Content-Type", JSON)

        json.NewEncoder(w).Encode(u) //asked for json, return json

    default:

        w.Header().Set("Content-Type", "text/html")

        renderTemplate(w, "view", u) // asked for html, return html

    }

}


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號