第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

總是嘗試返回相同的響應(yīng)結(jié)構(gòu)時(shí),如何最小化 Go Mux 中的重復(fù)代碼?

總是嘗試返回相同的響應(yīng)結(jié)構(gòu)時(shí),如何最小化 Go Mux 中的重復(fù)代碼?

Go
萬(wàn)千封印 2023-01-03 11:30:28
我有大量類似于以下代碼片段的代碼,我只是嘗試填充我的響應(yīng)結(jié)構(gòu)、json 編組輸出、設(shè)置狀態(tài)代碼并返回結(jié)果:if err := json.NewDecoder(r.Body).Decode(&user); err != nil {            response := responses.UserResponse{                Status:  http.StatusBadRequest,                Message: "error",                Data:    map[string]interface{}{"error": err.Error()},            }            rw.WriteHeader(http.StatusBadRequest)            errRes, _ := json.Marshal(response)            rw.Write(errRes)            return        }我試圖創(chuàng)建一個(gè)接收r變量(request.http)的函數(shù)來(lái)接收正文以及響應(yīng)的狀態(tài)代碼。但注意到我必須再次檢查函數(shù)外部的錯(cuò)誤代碼,然后再次執(zhí)行相同的響應(yīng)創(chuàng)建流程。Go 專家如何盡量減少像這樣的代碼重復(fù)?首先有這樣的代碼重復(fù)可以嗎?
查看完整描述

2 回答

?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊

通過(guò)將解碼調(diào)用和錯(cuò)誤處理移至可重用函數(shù)來(lái)最大程度地減少代碼重復(fù):


// Decode returns true if the request body is successfully decoded

// to the value pointed to by pv. Otherwise, decode writes an error

// response and returns false.

func decode(rw http.ResponseWriter, r *http.Request, pv interface{}) bool {

    err := json.NewDecoder(r.Body).Decode(pv)

    if err == nil {

        return true

    }

    rw.WriteHeader(http.StatusBadRequest)

    json.NewEncoder(rw).Encode(map[string]any{

        "status":  http.StatusBadRequest,

        "message": "error",

        "data":    map[string]any{"error": err.Error()},

    })

    return false

}

使用這樣的功能:


func userHandler(rw http.ResponseWriter, r *http.Request) {

    var u UserRequest

    if !decode(rw, r, &u) {

        return

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-01-03
?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊

最好抽象細(xì)節(jié)以提供有關(guān)您的處理程序所做工作的高級(jí)圖片。


func (h *rideHandler) handleCancelRideByPassenger(w http.ResponseWriter, r *http.Request) {


    ctx := r.Context()


    user := getUser(ctx)


    req := &cancelRequest{}


    if err := decode(r, req); err != nil {

        h.logger.Error("cancel ride: problem while decoding body request", zap.String("ip", r.RemoteAddr), zap.Error(err))

        h.respond.BadRequest(w, NewRESTError(reasonDecoding, "problem while decoding input parameters"))

        return

    }

    req.PublicID = chi.URLParam(r, "id")


    err := h.rideService.CancelRide(ctx, req, user)

    if err != nil {

        var validationErr *ValidationError

        switch {

        case errors.As(err, &validationErr):

            h.respond.BadRequest(w, NewRESTValidationError(reasonValidation, "problem while validating request", validationErr))

            return

        default:

            h.respond.InternalServerError(w, NewRESTError(reasonInternalError, "unknown problem occurred"))

            return

        }

    }


    h.respond.Ok(w, NewRESTResponse(&cancelRideResponse{Success: true}))


}

處理程序利用一些方便的糖函數(shù)來(lái)刪除重復(fù),并提供處理程序的高級(jí)概述而不是底層細(xì)節(jié)。


func decode(request *http.Request, val interface{}) error {

    dec := json.NewDecoder(request.Body)

    dec.DisallowUnknownFields()

    return dec.Decode(val)

}


type Responder struct {

    Encoder Encoder

    Before BeforeFunc

    After AfterFunc

    OnError OnErrorFunc

}


func (r *Responder) writeResponse(w http.ResponseWriter, v interface{}, status int) {


    if r.Before != nil {

        status, v = r.Before(w, v, status)

    }


    encoder := JSON

    if r.Encoder != nil {

        encoder = r.Encoder

    }


    w.Header().Set("Content-Type", encoder.ContentType())

    w.WriteHeader(status)

    if err := encoder.Encode(w, v); err != nil {

        if r.OnError != nil {

            r.OnError(err)

        }

    }


    if r.After != nil {

        r.After(v, status)

    }


}


func (r *Responder) Ok(w http.ResponseWriter, v interface{}) {

    r.writeResponse(w, v, http.StatusOK)

}

可能您應(yīng)該編寫自己的響應(yīng)包或檢查開源中的可用內(nèi)容。然后你就可以在任何地方使用這個(gè)具有相同響應(yīng)結(jié)構(gòu)的響應(yīng)包。


查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 2 回答
  • 0 關(guān)注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)