获取 http 响应的 RAW 标头

如何像这样将响应的原始标头作为字符串获取:


alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"

cache-control: private, max-age=0

content-encoding: br

content-type: text/html; charset=UTF-8

date: Tue, 08 Jan 2019 06:19:47 GMT

expires: -1

server: gws

set-cookie: 1P_JAR=2019-01-08-06; expires=Thu, 07-Feb-2019 06:19:47 GMT; path=/; domain=.google.com

set-cookie: SIDCC=ABtHo-HHNcja-cEEFEUXtBmLOdql4RTVMCWKGApEFFb8lWSAqaTF_fi0gDLoWaCzH3ogvEofah0; expires=Mon, 08-Apr-2019 06:19:47 GMT; path=/; domain=.google.com; priority=high

status: 200

set-cookie因为我想从响应标头中获取多个值。使用Http.Response.Header.Get("set-cookies")只返回最后一行。


或者我怎样才能得到多个cookie?


桃花长相依
浏览 214回答 3
3回答

侃侃无极

如果您想要原始标头,则需要编写一些包装器,以便在库net.Conn解释原始标头之前为其捕获原始标头http。但是您似乎并不真的需要原始标头——甚至根本不需要完整标头。如果您的目标只是读取多个 cookie,那么最简单的方法是使用Cookies响应中的方法。这两者之间的一个中间选项是读取Header响应的整个字段。这将显示完整的标头,但不能保证其顺序,并且将进行最少的解析(删除换行符等),因此不能说这是真正的“原始”。但是,它确实通过将所有标头值存储在一个[]string. 因此,就这个问题而言,这应该是完全足够的(尽管Response.Cookies如上所述,会更容易)。

蓝山帝景

在我看来,往返响应的最佳选择是 httputil#DumpResponse:package rawimport (   "bufio"   "bytes"   "net/http"   "net/http/httputil")func encode(res *http.Response) ([]byte, error) {   return httputil.DumpResponse(res, false)}func decode(data []byte) (*http.Response, error) {   return http.ReadResponse(bufio.NewReader(bytes.NewReader(data)), nil)}或者,如果您只想要 cookie,您可以这样做:package rawimport (   "encoding/json"   "net/http")func encode(res *http.Response) ([]byte, error) {   return json.Marshal(res.Cookies())}func decode(data []byte) ([]http.Cookie, error) {   var c []http.Cookie   if e := json.Unmarshal(data, &c); e != nil {      return nil, e   }   return c, nil}或者对于单个 cookie:package rawimport (   "encoding/json"   "net/http")func encode(res *http.Response, name string) ([]byte, error) {   for _, c := range res.Cookies() {      if c.Name == name {         return json.Marshal(c)      }   }   return nil, http.ErrNoCookie}func decode(data []byte) (*http.Cookie, error) {   c := new(http.Cookie)   if e := json.Unmarshal(data, c); e != nil {      return nil, e   }   return c, nil}https://golang.org/pkg/net/http/httputil#DumpResponse

HUX布斯

标准的 http 库默认解析标头。使用 fasthttp(您需要重新编写路由器和处理程序函数)将使您能够获取原始标头。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go