Heim > Backend-Entwicklung > Golang > Wie kann ich SOAP-Anfragen und -Antworten ohne direkte WSDL-Unterstützung verarbeiten?

Wie kann ich SOAP-Anfragen und -Antworten ohne direkte WSDL-Unterstützung verarbeiten?

Barbara Streisand
Freigeben: 2024-12-02 01:00:14
Original
720 Leute haben es durchsucht

How Can I Handle SOAP Requests and Responses in Go Without Direct WSDL Support?

WSDL/SOAP-Unterstützung in Go

Während es in Go keine direkte Unterstützung für WSDL gibt, stehen mehrere Optionen für den Umgang mit SOAP zur Verfügung Anfragen und Antworten.

Erstellen von SOAP-Anfragen Manuell

Das Standardpaket „coding/xml“ kann zum manuellen Erstellen von SOAP-Anfragen verwendet werden, es fehlt jedoch die erforderliche Funktionalität, um bestimmte Aspekte von SOAP zu verarbeiten, wie z. B. Namespaces und Präfixe.

Verwenden der xmlutil-Bibliothek

Die Bibliothek github.com/webconnex/xmlutil bietet mehr robuste Lösung für die Verarbeitung von SOAP-Anfragen und -Antworten. Es umfasst Funktionen wie:

  • Namespace- und Präfixregistrierung
  • Benutzerdefinierte Typregistrierung
  • XML-Kodierung und -Dekodierung mit Typinformationen
  • Unterstützung für Typ Durchsetzung, xsi:type-Attribute und mehr

Manuelles Dekodieren von SOAP Antworten

Um SOAP-Antworten zu dekodieren, können Sie das Paket „encoding/xml“ oder Bibliotheken wie xmlutil verwenden. Der Prozess beinhaltet die Verwendung des Decoders, um die XML-Antwort zu analysieren und die gewünschten Daten zu extrahieren.

Beispiel für die Verwendung von xmlutil

Hier ist eine modifizierte Version des in der Antwort bereitgestellten Beispiels :

package main

import (
    "bytes"
    "github.com/webconnex/xmlutil"
    "log"
    "strings"
    "encoding/xml"
)

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(`<soap:Envelope><soap:Body><MethodCall><One>one</One><Two>two</Two></MethodCall></soap:Body></soap:Envelope>`)

    enc := x.NewEncoder(buf)
    env := &Envelope{Body{MethodCall{
        One: "one",
        Two: "two",
    }}}
    if err := enc.Encode(env); err != nil {
        log.Fatal(err)
    }

    response := `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <MethodCallResponse>
            <Three>three</Three>
        </MethodCallResponse>
    </soap:Body>
</soap:Envelope>`
    
    dec := x.NewDecoder(strings.NewReader(response))
    var resp Envelope
    if err := dec.DecodeElement(&resp, nil); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%#v\n", resp)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich SOAP-Anfragen und -Antworten ohne direkte WSDL-Unterstützung verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage