最近在实现一个功能时需要使用第三方的接口,由于第三方只提供了一个 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.