我不知道这个问题是否有任何意义,但我想知道是否有任何方法可以得到用http.ResponseWriter表示的数据.我需要它来记录日志(log).

我已经在围棋中编写了一个API.

func api1(w http.ResponseWriter, req *http.Request) {       
    var requestData MyStruct
    err := json.NewDecoder(req.Body).Decode(&requestData)
    if err != nil {
        writeError(w, "JSON request is not in correct format")
        return
    }
    log.Println(" Request Data :", req.Body) // I am logging req
    result, err := compute()                 // getting result from a function

    if err != nil {
        errRes := ErrorResponse{"ERROR", err}
        response, er = json.Marshal(errRes) // getting error response
    } else {
        response, er = json.Marshal(result)
    }
    if er != nil {
        http.Error(w, er.Error(), 500) // writing error
        return
    }
    io.WriteString(w, string(response)) // writing response
}

目标是创建包含请求和响应数据的单个日志(log).响应可以是错误响应,也可以是已处理的响应.

我在想,如果我能得到写在http上的数据.然后,我可以创建一个有意义的日志(log).

这个是可能的吗?如果没有,请建议我如何实现这一点.

推荐答案

您可以使用io.MultiWriter-它创建一个将其写入复制到所有提供的编写器的编写器.因此,要记录响应

func api1(w http.ResponseWriter, req *http.Request) {
    var log bytes.Buffer
    rsp := io.MultiWriter(w, &log)
    // from this point on use rsp instead of w, ie
    err := json.NewDecoder(req.Body).Decode(&requestData)
    if err != nil {
        writeError(rsp, "JSON request is not in correct format")
        return
    }
    ...
}

现在你有了wlog中写入rsp的信息副本,你可以将log缓冲区的内容保存到控制台上显示的光盘上.

您可以使用io.TeeReader来创建一个读卡器,该读卡器将从给定的读卡器读取的内容写入给定的写卡器,这将允许您将req.Body的副本保存到日志(log)中,即

func api1(w http.ResponseWriter, req *http.Request) {
    var log bytes.Buffer
    tee := io.TeeReader(req.Body, &log)
    err := json.NewDecoder(tee).Decode(&requestData)
    ...
}

现在,由于json解码器从tee读取数据,因此req.Body的内容也被复制到log缓冲器中.

Go相关问答推荐

使用一元或服务器流将切片从GRPC服务器返回到客户端

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

Kafka golang 生产者在错误后更改分区计数

Golang chromedp Dockerfile

「GORM错误」不支持的数据类型:&[],不正确的模式

如何忽略打印达到最大深度限制 go colly

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

如何在 Golang 中打印 2 列表?

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

CORS grpc 网关 GoLang

级联调用泛型函数时的泛型类型推断

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

Go 中 SDL Surface 的 OpenGL 纹理

将 CSVExport 函数传递给处理程序 Gin

GOENV 只能使用 OS 环境设置

防止在 Go 公用文件夹中列出目录

如何在 Gorm 中获得特定日期的最大值?

手动下载并放置一个 golang mod 文件

空接口与泛型接口有何不同?