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

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

日志 http.響應(yīng)器內(nèi)容

日志 http.響應(yīng)器內(nèi)容

Go
慕的地6264312 2022-08-15 15:50:38
前提:我發(fā)現(xiàn)了類似的問題,但在我的案例中不起作用,所以請(qǐng)不要將其標(biāo)記為重復(fù)。我在Go中有一個(gè)HTTP服務(wù)器,我已經(jīng)創(chuàng)建了一個(gè)中間件來記錄請(qǐng)求,響應(yīng)時(shí)間,我也想記錄響應(yīng)。我在包下調(diào)用的函數(shù)中使用過。如何正確獲取響應(yīng)正文、狀態(tài)和標(biāo)頭,并將它們與其他數(shù)據(jù)一起記錄?httputil.DumpRequestHTTPRequestlogw http.ResponseWriter我的問題是:我想截獲響應(yīng)標(biāo)頭,狀態(tài)和正文,并與請(qǐng)求和響應(yīng)時(shí)間一起記錄代碼如下:log "core/logger"...func RequestLoggerMiddleware(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        start := time.Now()        defer func() {            log.Info(                fmt.Sprintf(                    "[Request: %s] [Execution time: %v] [Response: %s]",                    log.HTTPRequest(r),                    time.Since(start),                    // RESPONSE DATA HERE !!!!!!!                ))        }()        next.ServeHTTP(w, r)    })}
查看完整描述

2 回答

?
達(dá)令說

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

謝謝,@Sivachandran的回應(yīng)。它幾乎是完美的,只是由于指針而沒有實(shí)現(xiàn)。http.ResponseWriter


為了完整起見,我在這里發(fā)布了正確的解決方案代碼,因?yàn)榧词惯@個(gè)問題被給予了負(fù)分,也很難找到任何關(guān)于它的文檔。


Stackoverflow是一個(gè)交換問題的好地方,在我看來,這是一個(gè)非常好和困難的問題,無論是對(duì)于一個(gè)中間杠桿Golang程序員來說,所以它根本不配得負(fù)分!


這就是解決方案,享受:


// RequestLoggerMiddleware is the middleware layer to log all the HTTP requests

func RequestLoggerMiddleware(next http.Handler) http.Handler {

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

        start := time.Now()

        rww := NewResponseWriterWrapper(w)

        w.Header()

        defer func() {

            log.Info(

                fmt.Sprintf(

                    "[Request: %s] [Execution time: %v] [Response: %s]",

                    log.HTTPRequest(r),

                    time.Since(start),

                    rww.String(),

                ))

        }()

        next.ServeHTTP(rww, r)

    })

}


// ResponseWriterWrapper struct is used to log the response

type ResponseWriterWrapper struct {

    w          *http.ResponseWriter

    body       *bytes.Buffer

    statusCode *int

}


// NewResponseWriterWrapper static function creates a wrapper for the http.ResponseWriter

func NewResponseWriterWrapper(w http.ResponseWriter) ResponseWriterWrapper {

    var buf bytes.Buffer

    var statusCode int = 200

    return ResponseWriterWrapper{

        w:          &w,

        body:       &buf,

        statusCode: &statusCode,

    }

}


func (rww ResponseWriterWrapper) Write(buf []byte) (int, error) {

    rww.body.Write(buf)

    return (*rww.w).Write(buf)

}


// Header function overwrites the http.ResponseWriter Header() function

func (rww ResponseWriterWrapper) Header() http.Header {

    return (*rww.w).Header()


}


// WriteHeader function overwrites the http.ResponseWriter WriteHeader() function

func (rww ResponseWriterWrapper) WriteHeader(statusCode int) {

    (*rww.statusCode) = statusCode

    (*rww.w).WriteHeader(statusCode)

}


func (rww ResponseWriterWrapper) String() string {

    var buf bytes.Buffer


    buf.WriteString("Response:")


    buf.WriteString("Headers:")

    for k, v := range (*rww.w).Header() {

        buf.WriteString(fmt.Sprintf("%s: %v", k, v))

    }


    buf.WriteString(fmt.Sprintf(" Status Code: %d", *(rww.statusCode)))


    buf.WriteString("Body")

    buf.WriteString(rww.body.String())

    return buf.String()

}


查看完整回答
反對(duì) 回復(fù) 2022-08-15
?
收到一只叮咚

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

您需要包裝 以捕獲響應(yīng)數(shù)據(jù)。ResponseWriter


type ResponseWriterWrapper struct {

  w           http.ResponseWriter

  body        bytes.Buffer

  statusCode  int

}


func (i *ResponseWriterWrapper) Write(buf []byte) (int, error) {

  i.body.Write(buf)

  return i.w.Write(buf)

}


func (i *ResponseWriterWrapper) WriteHeader(statusCode int) {

  i.statusCode = statusCode

  i.w.WriteHeader(statusCode)

}


func (i *ResponseWriterWrapper) String() {

  var buf bytes.Buffer


  buf.WriteString("Response:")


  buf.WriteString("Headers:")

  for k, v := range i.w.Header() {

    buf.WriteString(fmt.Sprintf("%s: %v", k, v))

  }


  buf.WriteString(fmt.Sprintf("Status Code: %d", i.statusCode))


  buf.WriteString("Body")

  buf.WriteString(i.body.String())

}

將包裝器傳遞到并記錄捕獲的響應(yīng)數(shù)據(jù)。ServeHTTP


func RequestLoggerMiddleware(next http.Handler) http.Handler {

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

        start := time.Now()

        rww := ResponseWriterWrapper{ w: w }


        defer func() {

            log.Info(

                fmt.Sprintf(

                    "[Request: %s] [Execution time: %v] [Response: %s]",

                    log.HTTPRequest(r),

                    time.Since(start),

                    log.Info(rww.String())

                ))

        }()

        next.ServeHTTP(rww, r)

    })

}


查看完整回答
反對(duì) 回復(fù) 2022-08-15
  • 2 回答
  • 0 關(guān)注
  • 92 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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