最近在实现一个功能时需要使用第三方的接口,由于第三方只提供了一个 WSDL 文件的链接,于是研究了 golang 如何解析 WSDL 并调用相应接口, 本文就是介绍 WSDL 和 go 如何解析并调用。
WSDL 介绍
WSDL 是 Web Services Description Language(Web服务描述语言)的缩写。它是一种用于描述基于Web服务的通信协议和消息格式的XML格式语言。
WSDL 被广泛用于描述Web服务的接口和操作。它定义了Web服务所提供的功能、方法、参数、数据类型以及与服务进行交互的方式。通过WSDL文件,客户端应用程序可以了解如何与特定的Web服务进行通信。
WSDL文件通常包含以下几个主要部分:
- 服务定义:描述了Web服务的名称、命名空间和位置。
- 类型定义:定义了Web服务中使用的数据类型,例如字符串、整数等。
- 消息定义:定义了Web服务中使用的消息格式,包括输入和输出消息。
- 操作定义:定义了Web服务的操作或方法,包括输入和输出消息以及相关的参数。
- 绑定定义:定义了Web服务使用的通信协议和消息格式,例如SOAP(Simple Object Access Protocol)和HTTP(Hypertext Transfer Protocol)。
- 服务定义:将服务、绑定和端口等部分组合在一起,定义了Web服务的完整描述。
使用WSDL,开发人员可以生成客户端代码,使其能够与Web服务进行交互。客户端可以根据WSDL文件了解Web服务的结构和可用方法,以便正确地构造请求和解析响应。
总之,WSDL是一种用于描述Web服务接口和操作的语言,它提供了一种标准化的方式来描述和访问Web服务。
gowsdl
go语言如何解析 wsdl呢,我们使用 gowsdl 来解析 wsdl ,生成相应的 golang 代码。
安装
go install github.com/hooklift/gowsdl/cmd/gowsdl@latest
生成代码
使用命令 gowsdl -o myservice.go http://www.example.com/myservice?wsdl
生成代码。如果网络情况不好,我们也可以将 WSDL 文件下载下来解析 gowsdl -o xx.go a.xml
。
解析完毕会生成相应的客户端文件,我们只要通过生成的客户端链接服务即可执行相应的方法。
code:
package main
import (
"adx/myservice"
"fmt"
"github.com/hooklift/gowsdl/soap"
"golang.org/x/oauth2"
"log"
)
func main() {
client := soap.NewClient("https://ads.xxx?wsdl", soap.WithHTTPHeaders(map[string]string{
"Authorization": fmt.Sprintf("Bearer %s", xxxx),
}))
service := myservice.NewxxServiceInterface(client)
ReportableType := myservice.xx
type_ := myservice.xx
reply, err := service.xx(&myservice.xx{
Keys: []*myservice.xx{{
Name: "test111",
DisplayName: "test111",
Type_: &type_,
ReportableType: &ReportableType,
}},
})
if err != nil {
log.Fatal(err)
return
}
log.Println(reply)
}
小结
在对 soap 库的简单尝试后,发现了一些问题:
1 生成的 go 代码会有问题,会出现结构体中存在相同名称字段的问题 2 生成的方法字段不够规范
相比其它语言原生内置的wsdl解析库, go语言目前能够满足需求的库并不多,所以不推荐使用 go 解析 wsdl.