首頁 > 後端開發 > Golang > 在沒有直接 WSDL 支援的情況下,如何在 Go 中處理 SOAP 請求和回應?

在沒有直接 WSDL 支援的情況下,如何在 Go 中處理 SOAP 請求和回應?

Barbara Streisand
發布: 2024-12-02 01:00:14
原創
714 人瀏覽過

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

Go 中的WSDL/SOAP 支援

雖然Go 中沒有對WSDL 的直接支持,但有多種選項可用於處理SOAP請求和回應。

建構SOAP 請求手動

標準編碼/xml套件可用於手動建立SOAP請求,但它缺乏處理SOAP某些方面所需的功能,例如命名空間和前綴。

使用 xmlutil 函式庫

github.com/webconnex/xmlutil 函式庫提供了處理 SOAP 請求和回應的更強大的解決方案。它包括以下功能:

  • 命名空間和前綴註冊表
  • 自訂類型註冊
  • 帶有類型資訊的XML編碼和解碼
  • 對類型的支援強制執行、xsi:type屬性等

手動解碼 SOAP 回應

要解碼 SOAP 回應,您可以使用encoding/xml 套件或 xmlutil 等程式庫。該過程涉及使用解碼器解析 XML 響應並提取所需的資料。

使用 xmlutil 的範例

這裡是答案中提供的範例的修改版本:

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)
}
登入後複製

以上是在沒有直接 WSDL 支援的情況下,如何在 Go 中處理 SOAP 請求和回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板