Maison >développement back-end >Golang >Comment puis-je simplifier la gestion SOAP/WSDL en Go à l'aide du package xmlutil ?

Comment puis-je simplifier la gestion SOAP/WSDL en Go à l'aide du package xmlutil ?

DDD
DDDoriginal
2024-12-08 13:12:12397parcourir

How Can I Simplify SOAP/WSDL Handling in Go Using the xmlutil Package?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn