【发布时间】: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