我需要在golang代码中进行http调用。我的服务器代码将创建http请求对象并将其放在数据库中。
工作人员代码将从数据库中获取数据,并且应该能够使用持久请求对象进行http调用。
我可以通过序列化http请求直接在DB中保留请求对象,还是需要在数据库中单独添加方法/ URL / body?
答案 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.Write
和http.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()
:
public fields of Request
包括功能,马歇尔不接受:
json:不支持的类型:func()(io.ReadCloser,错误)
Request
还包含一个 private 字段ctx
,该字段阻止所有反序列化的常规尝试:
ctx是客户端上下文或服务器上下文。它应该只 通过使用WithContext复制整个Request进行修改。 它未导出以防止人们使用Context错误 并更改同一请求的调用者所拥有的上下文。