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.
InformationsquelleAutor vijay | 2017-09-19
Schreibe einen Kommentar