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
Barbara StreisandOriginal
2024-12-02 01:00:14714Durchsuche

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)
}

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!

Stellungnahme:
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