获取HTTP响应的所有标头,并在下一个HTTP请求中将其发回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取HTTP响应的所有标头,并在下一个HTTP请求中将其发回相关的知识,希望对你有一定的参考价值。

转到版本: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请求中按原样发送。

答案

如果您希望透明地代理请求,您可能会对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。

以上是关于获取HTTP响应的所有标头,并在下一个HTTP请求中将其发回的主要内容,如果未能解决你的问题,请参考以下文章

从 <img> 标签获取 HTTP 状态代码或响应标头?

我可以使用 tcpdump 获取 HTTP 请求、响应标头和响应正文吗?

javascript 节点脚本将所有http请求转发到另一个服务器,并使用access-control-allow-origin标头返回响应。关注redi

如何获取完整的HTTP请求(不是响应)标头

使用 cURL 仅从 HTTP POST 获取响应标头

当服务器仅从请求中读取标头时,Http客户端不会收到响应