2017-09-19 1 views
0

Version go fenêtres go1.8.1/amd64 exemple de code pour la demande http estObtenez tous les en-têtes de réponse HTTP et le renvoyer à la prochaine http demande

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) 

et je vais appeler la fonction RoundTripSoap12 sur correspondant Client http, ici quand j'envoie la demande pour la première fois je vais obtenir quelques en-têtes dans la réponse de HTTP ainsi ces en-têtes de réponse de HTTP devraient être envoyés comme est dans ma prochaine demande de HTTP.

+3

Pouvez-vous décrire le problème plus en détail (et moins de code)? – Volker

+0

@Volker fondamentalement je veux envoyer des en-têtes de réponse et des cookies de réponse dans la prochaine demande http – vijay

+0

Eh bien, net/http fournit l'accès à la fois, l'en-tête de réponse et les cookies de réponse, de sorte que vous pouvez les utiliser dans la requête suivante: a un en-tête. Je dois admettre que je ne comprends toujours pas le problème. Pourquoi ne pas écrire tout l'en-tête de la réponse à la prochaine demande? (Cela permettrait également de gérer les cookies). Pouvez-vous décrire les problèmes avec les cookies un peu plus en profondeur? – Volker

Répondre

2

Vous pouvez être intéressé par le paquet httputil et l'exemple proxy inverse fourni si vous souhaitez des demandes de proxy transparente:

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

Vous pouvez copier les en-têtes d'une requête à un autre assez facilement - la en-tête est un objet distinct, si r et rc sont http.Requests et vous ne me dérange pas de les partager un en-tête (vous devrez peut-être cloner place si vous souhaitez que les requêtes indépendantes):

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

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

Ou vous pouvez parcourir les clés et les valeurs et copier uniquement certains en-têtes, et/ou faire un clone à la place pour vous assurer de ne pas partager de mémoire. Voir le paquet http util ici pour des exemples de ceci - voir les fonctions cloneHeader et copyHeader dans reverseproxy.go lié ci-dessus.

+0

et si je renvoie des cookies de réponse dans la prochaine demande? – vijay

+0

Les cookies ne sont que des en-têtes, vous pouvez les inclure ou les omettre, quel est exactement le problème que vous voyez? –