Sokongan WSDL/SOAP dalam Go
Walaupun tiada sokongan langsung untuk WSDL dalam Go, terdapat beberapa pilihan yang tersedia untuk berurusan dengan SOAP permintaan dan respons.
Membina Permintaan SOAP Secara manual
Pakej pengekodan/xml standard boleh digunakan untuk membuat permintaan SOAP secara manual, tetapi ia tidak mempunyai fungsi yang diperlukan untuk mengendalikan aspek SOAP tertentu, seperti ruang nama dan awalan.
Menggunakan Perpustakaan xmlutil
Github.com/webconnex/xmlutil perpustakaan menyediakan penyelesaian yang lebih mantap untuk mengendalikan permintaan dan tindak balas SOAP. Ia termasuk ciri seperti:
Menyahkod Respons SOAP Secara Manual
Untuk menyahkod respons SOAP, anda boleh menggunakan pakej pengekodan/xml atau pustaka seperti xmlutil. Proses ini melibatkan penggunaan penyahkod untuk menghuraikan respons XML dan mengekstrak data yang dikehendaki.
Contoh Menggunakan xmlutil
Berikut ialah versi diubah suai bagi contoh yang disediakan dalam jawapan :
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) }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Permintaan dan Respons SOAP dalam Go Tanpa Sokongan WSDL Langsung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!