首页 > 后端开发 > Golang > 在没有直接 WSDL 支持的情况下,如何在 Go 中处理 SOAP 请求和响应?

在没有直接 WSDL 支持的情况下,如何在 Go 中处理 SOAP 请求和响应?

Barbara Streisand
发布: 2024-12-02 01:00:14
原创
713 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板