有没有办法序列化golang http请求对象并在DB

时间:2017-09-30 00:06:47

标签: http go

我需要在golang代码中进行http调用。我的服务器代码将创建http请求对象并将其放在数据库中。

工作人员代码将从数据库中获取数据,并且应该能够使用持久请求对象进行http调用。

我可以通过序列化http请求直接在DB中保留请求对象,还是需要在数据库中单独添加方法/ URL / body?

2 个答案:

答案 0 :(得分:0)

是的,您可以:https://golang.org/pkg/net/http/httputil/#DumpRequest

import "net/http/httputil"

dumped, err := httputil.DumpRequest(req, true)

答案 1 :(得分:0)

没有一种很好的方法来序列化http.Request结构本身(请参阅下面的注释),但是您可以将请求序列化回HTTP / 1.1有线格式(也可以反序列化)。可以使用Request.Writehttp.ReadRequest来完成:

func captureRequestData(req *http.Request) error {
    var b = &bytes.Buffer{} // holds serialized representation
    var tmp *http.Request
    var err error
    if err = req.Write(b); err != nil { // serialize request to HTTP/1.1 wire format
        return err
    }
    r := bufio.NewReader(b)
    if tmp, err = http.ReadRequest(r); err != nil { // deserialize request
        return err
    }
    *req = *tmp // replace original request structure
    return nil
}

序列化缓冲区的持久性只是保存b的副本。您可能希望保留string表示形式,该表示形式涉及一些附加转换:

s := b.String() // persist this
r := bufio.NewReader(strings.NewReader(s))

至少有两个原因,为什么您不能仅使用json.Marshal()

  1. public fields of Request包括功能,马歇尔不接受:

      

    json:不支持的类型:func()(io.ReadCloser,错误)

  2. Request还包含一个 private 字段ctx,该字段阻止所有反序列化的常规尝试:

      

    ctx是客户端上下文或服务器上下文。它应该只   通过使用WithContext复制整个Request进行修改。   它未导出以防止人们使用Context错误   并更改同一请求的调用者所拥有的上下文。