Go での WSDL/SOAP サポート
Go では WSDL を直接サポートしていませんが、SOAP を処理するために利用できるオプションがいくつかあります。リクエストとレスポンス。
SOAP リクエストの構築手動
標準のエンコーディング/xml パッケージを使用して SOAP リクエストを手動で作成できますが、名前空間やプレフィックスなどの SOAP の特定の側面を処理するために必要な機能が欠けています。
xmlutil ライブラリの使用
github.com/webconnex/xmlutil ライブラリは、SOAP リクエストとレスポンスを処理するためのより堅牢なソリューションを提供します。これには次のような機能が含まれます。
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 サイトの他の関連記事を参照してください。