Maison >développement back-end >Golang >Comment puis-je gérer les requêtes et les réponses SOAP dans Go sans prise en charge directe de WSDL ?

Comment puis-je gérer les requêtes et les réponses SOAP dans Go sans prise en charge directe de WSDL ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 01:00:14707parcourir

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

Support WSDL/SOAP dans Go

Bien qu'il n'y ait pas de support direct pour WSDL dans Go, plusieurs options sont disponibles pour gérer SOAP requêtes et réponses.

Création de requêtes SOAP Manuellement

Le package standard encoding/xml peut être utilisé pour créer des requêtes SOAP manuellement, mais il ne dispose pas des fonctionnalités nécessaires pour gérer certains aspects de SOAP, tels que les espaces de noms et les préfixes.

Utilisation de la bibliothèque xmlutil

La bibliothèque github.com/webconnex/xmlutil fournit un solution plus robuste pour gérer les requêtes et les réponses SOAP. Il comprend des fonctionnalités telles que :

  • Espace de noms et registre de préfixes
  • Enregistrement de type personnalisé
  • Encodage et décodage XML avec informations de type
  • Prise en charge du type application, attributs xsi:type et plus

Décodage manuel de SOAP Réponses

Pour décoder les réponses SOAP, vous pouvez utiliser le package encoding/xml ou des bibliothèques comme xmlutil. Le processus implique l'utilisation du décodeur pour analyser la réponse XML et extraire les données souhaitées.

Exemple d'utilisation de xmlutil

Voici une version modifiée de l'exemple fourni dans la réponse :

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

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