为了账号安全,请及时绑定邮箱和手机立即绑定

获取 http 响应的 RAW 标头

获取 http 响应的 RAW 标头

Go
桃花长相依 2023-06-01 09:55:35
如何像这样将响应的原始标头作为字符串获取:alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"cache-control: private, max-age=0content-encoding: brcontent-type: text/html; charset=UTF-8date: Tue, 08 Jan 2019 06:19:47 GMTexpires: -1server: gwsset-cookie: 1P_JAR=2019-01-08-06; expires=Thu, 07-Feb-2019 06:19:47 GMT; path=/; domain=.google.comset-cookie: SIDCC=ABtHo-HHNcja-cEEFEUXtBmLOdql4RTVMCWKGApEFFb8lWSAqaTF_fi0gDLoWaCzH3ogvEofah0; expires=Mon, 08-Apr-2019 06:19:47 GMT; path=/; domain=.google.com; priority=highstatus: 200set-cookie因为我想从响应标头中获取多个值。使用Http.Response.Header.Get("set-cookies")只返回最后一行。或者我怎样才能得到多个cookie?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

如果您想要原始标头,则需要编写一些包装器,以便在库net.Conn解释原始标头之前为其捕获原始标头http

但是您似乎并不真的需要原始标头——甚至根本不需要完整标头。如果您的目标只是读取多个 cookie,那么最简单的方法是使用Cookies响应中的方法。

这两者之间的一个中间选项是读取Header响应的整个字段。这将显示完整的标头,但不能保证其顺序,并且将进行最少的解析(删除换行符等),因此不能说这是真正的“原始”。但是,它确实通过将所有标头值存储在一个[]string. 因此,就这个问题而言,这应该是完全足够的(尽管Response.Cookies如上所述,会更容易)。


查看完整回答
反对 回复 2023-06-01
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

在我看来,往返响应的最佳选择是 httputil#DumpResponse:


package raw


import (

   "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 raw


import (

   "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 raw


import (

   "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


查看完整回答
反对 回复 2023-06-01
?
HUX布斯

TA贡献1876条经验 获得超6个赞

标准的 http 库默认解析标头。
使用 fasthttp(您需要重新编写路由器和处理程序函数)将使您能够获取原始标头。

查看完整回答
反对 回复 2023-06-01
  • 3 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信