ホームページ >バックエンド開発 >Golang >直接の WSDL サポートなしで Go で SOAP リクエストとレスポンスを処理するにはどうすればよいですか?

直接の WSDL サポートなしで Go で SOAP リクエストとレスポンスを処理するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 01:00:14713ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。