本文章描述了一个用Java编写的不使用专门SOAP库的简单通用SOAP客户机。该客户机可以让您用任何XML编辑器(或文本编辑器)创建自己的请求,而不是在暗中为您创建SOAP请求XML文档。该客户机向您显示实际的SOAP响应XML文档,而不是仅仅提供远程方法的返回值。这个简短的Java程序精确显示了什么是SOAP:打开HTTP连接、发送适当XML以调用远程方法、接着读取服务器返回的XML响应。
SOAP(简单对象访问协议)是IBM、Microsoft、DevelopMentor和UserLand Software为在网络上交换信息而开发的一种已在发展的W3C标准。随着Web上可以公开使用的SOAP服务器的不断增加,SOAP几乎对用任何语言编写的程序――即使是用流行的简单语言(如Visual Basic、JavaScript和perl)编写的非常短小的程序――执行着HTML对Web浏览器所做的事:它为这些程序提供一个简单的方法来利用万维网上不断增加的可用信息源。
与HTML类似,SOAP提供一套标记来表示在Web上使用HTTP传输协议(从SOAP 1.1以来,SMTP也可以)发送的不同信息块的作用。但是,SOAP向您提供的能力远远强于HTML。使用SOAP,您的程序向SOAP服务器发送“SOAP请求”(一个简短的XML文档,描述在远程机器上要调用的方法和所有要传递给它的参数)。SOAP服务器将尝试用那些参数执行该方法,并将SOAP响应发回程序。 响应可以是执行的结果,也可以是相应的错误消息。可以使用公共SOAP服务器为提出请求的客户机提供股票价格、最新的货币兑换率、FedEx包裹跟踪信息、代数表达式的解决方案以及其它各类信息。
在SOAP存在之前,尝试使用这种信息的程序必须先捕获Web页面,然后“刮下”HTML,以查找适当的文本。 对这些Web页面进行可视的重新设计(例如,将当前股票价格放到表中第三列而不是第二列中)就可以使这些程序无用。SOAP规范以及它所携带的简要的SOAP请求和响应模式为客户机和服务器之间的联络提供了一个框架,该框架是那些强健得多的信息收集工具的基础。
有许多SOAP客户机可用于大多数的流行编程语言;有关详尽列表,请参阅SOAP::Lite for Perl主页上的SOAP Toolkits部分(请参阅参考资料)。大多数SOAP客户机都提供类库、COM对象或从您自己程序调用的等同对象。通常,使用这些客户机库遵循以下模式:
·程序传递要调用的远程方法的名称和所有必需参数。
·库组装SOAP请求的适当XML文档以将这一信息打包。
·库将这一XML文档传递给SOAP端点URL标识的SOAP服务器,这与通过指定服务器的URL将浏览器指向Web服务器地址很类似。
·SOAP服务器尝试执行方法后,它组装包含执行结果的SOAP响应XML文档,并将它发回SOAP客户机。
·接收SOAP响应时,客户机库对XML进行语法分析以获得方法调用的结果,并将结果传递给使用库的程序。
SOAPClient4XG
SOAP的介绍(请参阅developerWorks上Graham Glass编写得极佳的“Web服务革命”专栏)总是讨论用于SOAP请求和响应的XML的结构,但是我接触到的SOAP客户机总是会暗中进行XML组装和语法分析,所以我从来不用知道。作为使用XML的人员,我 曾想自己执行XML部分;我认为如果SOAP这样简单,那么我应该能够编写一个简单的SOAP客户机来读取SOAP请求的XML文档、将它发送到命令行上指定的SOAP端点URL、读回响应文档并输出该响应。这将使它成为一个真正的通用SOAP客户机,因为它调用任何SOAP服务器上的任何方法。
清单1中显示的SoapClient4XG(“SOAP Client for XML Geeks”)Java类执行该任务,而不使用早先提到的SOAP Toolkits页面上列出的任何专用Java SOAP类(请参阅参考资料)。检查了必需的SOAP端点URL和SOAP XML文档文件名参数及可选的SOAP操作参数后,读入文件,将它发送到SOAP服务器,读回响应,然后将其输出到标准出口。
因为该SOAP客户机使用HTTP协议发送XML SOAP请求,所以大量必需做的工作就是HTTP设置。Java提供了一个HttpURLConnection类, 它有许多“设置”方法来正确设置每个HTTP参数,并且可以用简单的字符串来设置大多数参数。需要一点额外代码的一个HTTP参数是Content-Length,所以SoapClient4XG通过在读取XML请求之后将它放到一个字节数组中,然后检查字节数组的长度特性来计算XML请求的长度。
可使用其它会代您设置这些HTTP参数的HTTP实现。Sun开放源码的Brazil Web应用程序框架(请参阅参考资料)会自动处理HTTP问题,并使处理适当SOAP错误更为容易,因为(不象早期的HttpURLConnection类)它是一个没有经过特定编写以用Java小应用程序减轻装入图像和其它Web资源工作的通用HTTP类。
请参考“清单1”,获取 完整的SOAP客户机。
运行它
Xmethods.com(请参阅参考资料)提供了一份在不断发展的公共可用SOAP服务列表。除了告诉您可选SOAP操作参数是否对每个服务是必需的之外,它们的许多描述还包括样本XML请求,所以我复制了对气温SOAP服务器的样本请求,添加了一些空白空间, 并在zipcode元素中替代了自己的邮政编码,如清单2所示。
这个文件存储在名为weattherreq.xml的文件中,清单3中的命令行将它的内容发送到我获得样本XML的同一个XMethods Web页面上指定的SOAP端点URL。
如清单4中所示,SOAP服务器发回SOAP响应,其中,当前温度存储在response元素中。
因为这个SOAP客户机从您创建的XML文档文件(而不是从暗中为您创建的无访问权的文件)发送SOAP请求,所以,可以使用XML编辑器或文本编辑器来直接修改发送的XML。更重要的是,该SOAP客户机显示了利用SOAP服务正在发展的选项是何等容易。 您只要命名服务的SOAP端点URL,设置HTTP参数,发送表示方法的一些XML和要传递给它们的参数,然后等待响应。
一定要仔细检查可用于您喜爱的编程语言的SOAP库。通常,它们提供的错误处理比我的SOAP客户机的更好,提供的其它一些功能是用于强健应用程序开发的较好基础。 请记住,所有这一切之下的简单性和这种简单协议所实现的强大功能。
关于作者
Bob Ducharme(www.snee.com/bob)是Manning Publications即将出版的XSLT Quickly、Prentice Hall的XML:The Annotated Specification与SGML CD及McGraw Hill的Operating Systems Handbook等书的作者。他为XML.com撰写了“Transforming XML”专栏,并为XML Magazine、XML Journal、IBM developerWorks和Prentice Hall的XML Handbook撰稿。他经常在业界会议和用户组中演讲,是UDICo(www.udico.com)负责企业文档的副总裁,他还制造了一个高性能小型中间件引擎和开发工具箱。他在哥伦比亚大学获得宗教方面的学士学位,在纽约大学获得计算机科学硕士学位,现在和他的妻子Jennifer及两个女儿Madeline、Alice 生活在布鲁克林地区的Park Slope。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
内存数据网格提供商一头扎进Java
10年的时间里,应用性能解决方案提供商Alachisoft一直在用NCache(针对N-Tier和网格计算.NET应用的内存计算和数据网格产品)为.NET社区服务。
-
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高, 直到把内存吃完应用崩溃,但是这个wrapper
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高 […]
-
Google App Engine for Java 对于目前中国需要学习吗?
-
前无古人后无来者的Java平台
开发人员一直在致力于保持Java的活力,经过20年后,我们感觉从来没有更好的、更令人激动的时刻如同Java社区一样。