Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengendalikan Permintaan dan Respons SOAP dalam Go Tanpa Sokongan WSDL Langsung?

Bagaimanakah Saya Boleh Mengendalikan Permintaan dan Respons SOAP dalam Go Tanpa Sokongan WSDL Langsung?

Barbara Streisand
Lepaskan: 2024-12-02 01:00:14
asal
720 orang telah melayarinya

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

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:

  • Ruang nama dan pendaftaran awalan
  • Pendaftaran jenis tersuai
  • Pengekodan dan penyahkodan XML dengan maklumat jenis
  • Sokongan untuk jenis penguatkuasaan, atribut xsi:type, dan lagi

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan