Prise en charge de SOAP/WSDL dans Go
Malgré le manque de support natif de WSDL dans Go, il est possible d'encoder et de décoder manuellement les requêtes SOAP et les réponses. Cependant, ce processus peut être complexe et varier selon les différents serveurs.
Approche alternative avec le package GitHub
Pour relever ces défis, le package GitHub xmlutil (https:// github.com/webconnex/xmlutil) propose une solution. Il simplifie la gestion de SOAP en vous permettant de spécifier qu'un serveur nécessite des types xsi, éliminant ainsi le besoin de personnalisations complexes.
Exemple d'implémentation
Vous trouverez ci-dessous un exemple d'utilisation de xmlutil pour gérer le SAVON :
package main import ( "bytes" "fmt" "github.com/webconnex/xmlutil" "log" ) type Envelope struct { Body `xml:"soap:"` } type Body struct { Msg interface{} } type MethodCall struct { One string Two string } type MethodCallResponse struct { Three string } func main() { x := xmlutil.NewXmlUtil() x.RegisterNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi") x.RegisterNamespace("http://www.w3.org/2001/XMLSchema", "xsd") x.RegisterNamespace("http://www.w3.org/2003/05/soap-envelope", "soap") x.RegisterTypeMore(Envelope{}, xml.Name{"http://www.w3.org/2003/05/soap-envelope", ""}, []xml.Attr{ xml.Attr{xml.Name{"xmlns", "xsi"}, "http://www.w3.org/2001/XMLSchema-instance"}, xml.Attr{xml.Name{"xmlns", "xsd"}, "http://www.w3.org/2001/XMLSchema"}, xml.Attr{xml.Name{"xmlns", "soap"}, "http://www.w3.org/2003/05/soap-envelope"}, }) x.RegisterTypeMore("", xml.Name{}, []xml.Attr{ xml.Attr{xml.Name{"http://www.w3.org/2001/XMLSchema-instance", "type"}, "xsd:string"}, }) buf := new(bytes.Buffer) buf.WriteString(`<?xml version="1.0" encoding="utf-8"?>`) buf.WriteByte('\n') enc := x.NewEncoder(buf) env := &Envelope{Body{MethodCall{ One: "one", Two: "two", }}} if err := enc.Encode(env); err != nil { log.Fatal(err) } fmt.Printf("%s\n\n", buf.Bytes()) dec := x.NewDecoder(bytes.NewBufferString(`<?xml version="1.0" encoding="utf-8"?> <soap:Envelope> <soap:Body> <MethodCallResponse> <Three>three</Three> </MethodCallResponse> </soap:Body> </soap:Envelope>`)) var resp MethodCallResponse if err := dec.DecodeElement(&resp); err != nil { log.Fatal(err) } fmt.Printf("%#v\n\n", resp) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!