在REST和RPC大行其道的今天,支持SOAP(简答对象访问协议)作为Web服务消息交换协议的情况是越来越少了。但在一些遗留系统中,尤其是采用微软技术栈的服务系统中,SOAP依然占有一席之地,比如在一些医院院内的IT系统中。
Go语言诞生后,主流的Web Service设计已经开始过渡到REST和RPC,Go相关开源项目也以对REST和RPC的支持为主。而对SOAP的支持则少而零散,社区里也没有对SOAP支持的重量级开源项目,在awesome go的各种list中也难觅有关SOAP的推荐项目的身影。
但Gopher世界还是有以client身份与SOAP service交互或是实现SOAP server的需求的。在这篇文章中,我就和大家一起来探索一下如何基于一些开源项目,使用Go实现SOAP client和SOAP Server的。
一.SOAP简介如果你觉得SOAP这个协议很陌生也不奇怪,因为SOAP协议诞生于“遥远”的1998年,2000年才提交到标准化组织。SOAP是一种消息传递协议规范,用于在计算机网络的Web服务中实现交换结构化信息。其目的是促进可扩展性、中立性和独立性。它使用XML作为承载消息的格式,并依赖于应用层协议,通常是HTTP或SMTP(简单邮件传输协议),用于消息协商和传输。经过若干年的演进,其主要binding的协议是http,其支持SMTP Binding已经极少有应用了。现在,我们可以不严谨的说,SOAP可以理解为“xml over http”。并且从SOAP Body的形式来看,SOAP也像是一种使用XML作为序列化编码格式的RPC调用。
SOAP目前存在两个版本:1.1和1.2版本。一些比较old的SOAP服务仅支持1.1版本,而一些新的SOAP服务则两个版本都支持。
下面是SOAP协议的通用结构:
基于这个结构,我们看看SOAP(over http)的Request和Response的样子:
关于SOAP协议的更多细节,可以参见SOAP协议规范,这里限于篇幅就不细说了。
二.环境准备本文中使用的Go语言版本为go 1.11.2。
获取wsdl文件
现在在互联网上要找到一个面向公共的、免费的SOAP服务着实困难。free-web-services.com上的很多服务已经不提供SOAP服务了,并且多数提供SOAP的服务也已经打不开页面了。在本文中,我们将使用www.dneonline.com/calculator.asmx这个calculator服务,至少目前它还是ready的(不过也不保证它在将来能一直ready)。
我们可以通过下面命令获得这个calculator服务的WSDL文件。
$cd /Users/tony/go/src/github.com/bigwhite/experiments/go-soap/pkg
$curl http://www.dneonline.com/calculator.asmx\?WSDL > calculator.wsdl
$cat calculator.wsdl
<?xml version="1.0" encoding="utf-8"?>
l:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapen