Holen Sie sich alle Header der HTTP-Antwort aus und senden Sie es zurück in die nächste HTTP-Anforderung
Go, version: go1.8.1 windows/amd64
Beispiel-code für HTTP-Anforderung ist:
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)
Ich rufe die RoundTripSoap12
- Funktion auf die entsprechenden HTTP-client.
Wenn ich senden Sie eine Anfrage für die erste Zeit werde ich mir einige Header in der HTTP-Antwort, so dass diese HTTP-Antwort-Header gesendet werden sollen, ist in meinen nächsten HTTP-request.
- Können Sie beschreiben das problem im detail (und weniger code)?
- im Grunde möchte ich zum senden der Antwort-Header und Antwort-cookies in die nächste http-Anforderung
- Naja, net/http ermöglicht den Zugriff auf beide, der response header und der response-cookies, so dass Sie Sie verwenden können Sie bei der nächsten Anfrage: Die Anfrage hat auch einen header. Ich muss zugeben, ich verstehe immer noch nicht das problem. Warum nicht einfach schreiben, der ganze header der Antwort auf die nächste Anfrage? (Das würde für den Umgang mit cookies als auch). Können Sie beschreiben, die Probleme mit cookies, die ein bisschen mehr in die Tiefe?
- okay, also problem hier ist der erste request wird eine Authentifizierung verlangen, die Renditen Header und cookies für weitere Anfragen. weiter Anfragen werden nur bearbeitet, wenn es enthält die cookies und Header zurückgegeben, in der ersten/auth-Anfrage.... bin ich klar
- Dann speichern Sie einfach die Header/cookies für die weitere Verwendung und fügen Sie Sie der nachfolgenden Anforderungen. Ich kann immer noch nicht sehen ein grundlegendes problem, nur etwas Programmierung erforderlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie interessieren können, der in der httputil Paket und die reverse-proxy-Beispiel zur Verfügung gestellt, wenn Sie wollen proxy-Anfragen:
https://golang.org/src/net/http/httputil/reverseproxy.go
Kopieren Sie die Kopfzeilen aus einer Anfrage zu einem anderen relativ leicht - der Header ist ein separates Objekt, wenn r und rc sind http.Anfragen und stört Sie nicht, Sie teilen sich eine header (Sie müssen eventuell den Klon, stattdessen, wenn Sie möchten unabhängige Anfragen):
https://play.golang.org/p/q2KUHa_qiP
Oder Sie schauen können, über Schlüssel und Werte, und nur dann kopieren, bestimmte Header und/oder ein Klon statt, um sicherzustellen, dass Sie haben keine Speicher. Finden Sie unter http-util-Paket hier für Beispiele - siehe die Funktionen cloneHeader und copyHeader innen reverseproxy.gehen Sie weiter oben verlinkt.