【问题标题】:Get all the headers of HTTP response and send it back in next HTTP request获取 HTTP 响应的所有标头并在下一个 HTTP 请求中将其发回
【发布时间】:2019-04-14 19:15:17
【问题描述】:

Go 版本:go1.8.1 windows/amd64

HTTP 请求的示例代码是:

func (c *Client) RoundTripSoap12(action string, in, out Message) error {
    fmt.Println("****************************************************************")
    headerFunc := func(r *http.Request) {
        r.Header.Add("Content-Type", fmt.Sprintf("text/xml; charset=utf-8"))
        r.Header.Add("SOAPAction", fmt.Sprintf(action))
        r.Cookies()
    }
    return doRoundTrip(c, headerFunc, in, out)
}

func doRoundTrip(c *Client, setHeaders func(*http.Request), in, out Message) error {
    req := &Envelope{
        EnvelopeAttr: c.Envelope,
        NSAttr:       c.Namespace,
        Header:       c.Header,
        Body:         Body{Message: in},
    }

    if req.EnvelopeAttr == "" {
        req.EnvelopeAttr = "http://schemas.xmlsoap.org/soap/envelope/"
    }
    if req.NSAttr == "" {
        req.NSAttr = c.URL
    }
    var b bytes.Buffer
    err := xml.NewEncoder(&b).Encode(req)
    if err != nil {
        return err
    }
    cli := c.Config
    if cli == nil {
        cli = http.DefaultClient
    }
    r, err := http.NewRequest("POST", c.URL, &b)
    if err != nil {
        return err
    }
    setHeaders(r)
    if c.Pre != nil {
        c.Pre(r)
    }
    fmt.Println("*************", r)
    resp, err := cli.Do(r)
    if err != nil {
        fmt.Println("error occured is as follows ", err)
        return err
    }
    fmt.Println("response headers are: ", resp.Header.Get("sprequestguid"))
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
        // read only the first Mb of the body in error case
        limReader := io.LimitReader(resp.Body, 1024*1024)
        body, _ := ioutil.ReadAll(limReader)
        return fmt.Errorf("%q: %q", resp.Status, body)
    }
    return xml.NewDecoder(resp.Body).Decode(out)

我会在对应的HTTP客户端上调用RoundTripSoap12函数。 当我第一次发送请求时,我会在 HTTP 响应中获得一些标头,因此这些 HTTP 响应标头应该在我的下一个 HTTP 请求中按原样发送。

【问题讨论】:

  • 你能把问题描述得更详细(代码更少)吗?
  • @Volker 基本上我想在下一个 http 请求中发送响应头和响应 cookie
  • 好吧,net/http 提供了对响应标头和响应 cookie 的访问,因此您可以在下一个请求中使用它们:该请求也有一个标头。我不得不承认我仍然不明白这个问题。为什么不直接将整个响应头写入下一个请求? (这也将处理 cookie)。你能更深入地描述一下 cookie 的问题吗?
  • @Volker,好的,这里的问题是第一个请求是一个身份验证请求,它返回标头和 cookie 以供进一步请求。仅当它包含在第一个/身份验证请求中返回的 cookie 和标头时,才会处理下一个请求....我清楚
  • 然后只需保存 headers/cookies 以供进一步使用并将它们添加到后续请求中。我仍然看不到根本问题,只是需要一些编程。

标签: http go http-headers


【解决方案1】:

如果您希望透明地代理请求,您可能对 httputil 包和提供的反向代理示例感兴趣:

https://golang.org/src/net/http/httputil/reverseproxy.go

您可以相当容易地将标头从一个请求复制到另一个请求 - 标头是一个单独的对象,如果 r 和 rc 是 http.Requests 并且您不介意它们共享标头(如果你想要独立的请求):

rc.Header = r.Header // note shallow copy
fmt.Println("Headers", r.Header, rc.Header)

https://play.golang.org/p/q2KUHa_qiP

或者您可以查看键和值并仅复制某些标头,和/或进行克隆以确保您不共享内存。有关此示例,请参见此处的 http util 包 - 请参见上面链接的 reverseproxy.go 中的函数 cloneHeader 和 copyHeader。

【讨论】:

  • 如果我在下一个请求中发回响应 cookie?
  • Cookie 只是标题,您可以包含它们或省略它们,您看到的具体问题是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多