在go中,如何检查写入http.ResponseWriter的http响应?

在go中,如何检查写入http.ResponseWriter的http响应?,http,go,Http,Go,我可能遗漏了一些明显的东西,但我正在尝试调试go服务器编写的HTTP响应 我看到有可用的,但它需要一个http.Response对象,而我可用的是http.ResponseWriter 有没有办法从http.ResponseWriter中提取http.Response,以便我可以检查控制台或日志响应的内容 背景: 我正在使用和编写一个简单的服务器端身份验证,这是一个默认示例,但无法理解为什么前端(使用)将失败的身份验证(不正确的密码)解释为成功 以下是片段: r = mux.NewRouter(

我可能遗漏了一些明显的东西,但我正在尝试调试go服务器编写的HTTP响应

我看到有可用的,但它需要一个http.Response对象,而我可用的是http.ResponseWriter

有没有办法从http.ResponseWriter中提取http.Response,以便我可以检查控制台或日志响应的内容

背景:

我正在使用和编写一个简单的服务器端身份验证,这是一个默认示例,但无法理解为什么前端(使用)将失败的身份验证(不正确的密码)解释为成功

以下是片段:

r = mux.NewRouter()
r.HandleFunc("/token", func (w http.ResponseWriter, r *http.Request) {

    fmt.Printf("r.HandleFunc /token\n")

    resp := server.NewResponse()
    defer resp.Close()

    r.ParseForm()

    grantType := r.FormValue("grant_type")
    username := r.FormValue("username")
    password := r.FormValue("password")
    fmt.Printf("/token : grantType=%s  username=%s  password=%s\n", grantType, username, password)

    if ar := server.HandleAccessRequest(resp, r); ar != nil {
        if username == "user" && password == "correct-password" {
            ar.Authorized = true
        } else {
            ar.Authorized = false
        }
        server.FinishAccessRequest(resp, r, ar)
    }

    osin.OutputJSON(resp, w, r)

    // Debug - doesn't work yet
    dump, err := httputil.DumpResponse(w, true)
    if err != nil {
        fmt.Printf("%s\n", dump)
    }
});
http.Handle("/token", r)
写入(实现
http.ResponseWriter
)并检查它

包中的示例:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httptest"
)

func main() {
    handler := func(w http.ResponseWriter, r *http.Request) {
        http.Error(w, "something failed", http.StatusInternalServerError)
    }

    req, err := http.NewRequest("GET", "http://example.com/foo", nil)
    if err != nil {
        log.Fatal(err)
    }

    w := httptest.NewRecorder()
    handler(w, req)

    fmt.Printf("%d - %s", w.Code, w.Body.String())
}
编辑以回答评论中的问题:

如果我正确理解了您的问题,那么是的,您可以使用闭包进行此操作

将以下内容视为您的处理程序:

func MyHandler(w http.ResponseWriter, r *http.Request) {
    // do useful stuff...
}
然后,您可以向ServeMax注册以下闭包,以获得所需的效果:

http.HandleFunc("/my/url", func(w http.ResponseWriter, r *http.Request) {
    // first call MyHandler
    MyHandler(w, r)

    // then log whatever you need
    log.Printf("%#v\n", w)
})

如果这个模式对您有用,那么您可以编写一个更高阶的方法,将任何
func(http.ResponseWriter,*http.Request)
封装在这样的闭包中。不过,这本身就是一个主题。

谢谢你的片段。通过使用该示例以及重构代码,我能够将现有的处理程序挂接到httptest.Recorder。但是,是否可以简单地在func(w http.ResponseWriter,r*http.Request)处理程序本身的末尾插入日志语句?通过这种方式,我可以在与浏览器交互时跟踪响应。@zaichang我已经修改了我的答案以解决您的问题。谢谢您,我得到的输出类似于
和http.response{conn:(*http.conn)(0xc28048000),req:(*http.Request)(0xc280268f0),wroteHeader:true,wroteContinue:false,w:(*bufio.Writer)(0xc28044580),cw:http.chunkWriter{res:(*http.response)(0xc20804ab40),……dateBuf:[29]uint8{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},克莱恩布夫:[10]uint8{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
这看起来像是一个对象转储,我不知道如何获取json消息体。@zaichang:请为此打开一个新问题。我在这里添加了以下问题: