版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编写简单SOAP客户机 作者:未知 时间:2004-12-06 12:12 出处:Blog 责编:My FAQ 摘要:暂无 作者:Bob DuCharme 本文描述了一个用Java编写的不使用专门SOAP库的简单通用SOAP客户机。该客户机可以让您用任何 XML 编辑器(或文本编辑器)创建自己的请求, 而不是在暗中为您创建 SOAP 请求 XML 文档。 该客户机向您显示实际的 SOAP 响应 XML 文档,而不是仅仅提供远程方法的返回值。 这个简短的 Java 程序精确显示了什么是 SOAP:打开 HTTP 连接、发送适当 XML 以调用远程方法、接着读取服务器返回的 XML 响应。 通用
2、Java SOAP 客户机SOAP(简单对象访问协议)是 IBM、Microsoft、DevelopMentor 和 UserLand Software 为在网络上交换信息而开发的一种已在发展的 W3C 标准。 随着Web上可以公开使用的SOAP服务器的不断增加,SOAP几乎对用任何语言编写的程序即使是用流行的简单语言(如 Visual Basic、JavaScript 和 perl)编写的非常短小的程序执行着HTML对Web浏览器所做的事:它为这些程序提供一个简单的方法来利用万维网上不断增加的可用信息源。 与 HTML 类似,SOAP 提供一套标记来表示在Web上使用HTTP传输协议(从 S
3、OAP 1.1 以来,SMTP 也可以)发送的不同信息块的作用。但是,SOAP向您提供的能力远远强于HTML。使用SOAP,您的程序向 SOAP服务器发送“SOAP请求”(一个简短的XML文档,描述在远程机器上要调用的方法和所有要传递给它的参数)。SOAP服务器将尝试用那些参数执行该方法,并将SOAP响应发回程序。响应可以是执行的结果,也可以是相应的错误消息。可以使用公共SOAP服务器为提出请求的客户机提供股票价格、最新的货币兑换率、FedEx 包裹跟踪信息、代数表达式的解决方案以及其它各类信息。 在SOAP存在之前,尝试使用这种信息的程序必须先捕获Web页面,然后“刮下”HTML,以查找适当
4、的文本。 对这些Web页面进行可视的重新设计(例如,将当前股票价格放到表中第三列而不是第二列中)就可以使这些程序无用。SOAP规范以及它所携带的简要的SOAP请求和响应模式为客户机和服务器之间的联络提供了一个框架,该框架是那些强健得多的信息收集工具的基础。 有许多SOAP客户机可用于大多数的流行编程语言;有关详尽列表,请参阅 SOAP:Lite for Perl 主页上的 SOAP Toolkits 部分(请参阅参考资料)。大多数 SOAP 客户机都提供类库、COM 对象或从您自己程序调用的等同对象。通常,使用这些客户机库遵循以下模式: · 程序传递要调用的远程方法的名称和所有必需参
5、数。 · 库组装 SOAP 请求的适当 XML 文档以将这一信息打包。 · 库将这一 XML 文档传递给 SOAP 端点 URL 标识的 SOAP 服务器,这与通过指定服务器的 URL 将浏览器指向 Web 服务器地址很类似。 · SOAP 服务器尝试执行方法后,它组装包含执行结果的 SOAP 响应 XML 文档,并将它发回 SOAP 客户机。 · 接收SOAP响应时,客户机库对XML进行语法分析以获得方法调用的结果,并将结果传递给使用库的程序。 SOAPClient4XGSOAP 的介绍(请参阅 developerWorks 上 Graham Glas
6、s 编写得极佳的“ Web 服务革命”专栏)总是讨论用于 SOAP 请求和响应的 XML 的结构,但是我接触到的 SOAP 客户机总是会暗中进行 XML 组装和语法分析,所以我从来不用知道。 作为使用 XML 的人员,我曾想自己执行 XML 部分;我认为如果 SOAP 这样简单,那么我应该能够编写一个简单的 SOAP 客户机来读取 SOAP 请求的 XML 文档、将它发送到命令行上指定的 SOAP 端点 URL、读回响应文档并输出该响应。这将使它成为一个真正的通用 SOAP 客户机,因为它调用任何 SOAP 服务器上的任何方法。 清单1中显示的 SoapClient4XG(“SOAP Clie
7、nt for XML Geeks”)Java类执行该任务,而不使用早先提到的 SOAP Toolkits 页面上列出的任何专用 Java SOAP 类(请参阅参考资料)。 检查了必需的 SOAP 端点 URL 和 SOAP XML 文档文件名参数及可选的 SOAP 操作参数后,读入文件,将它发送到 SOAP 服务器,读回响应,然后将其输出到标准出口。 清单1 Listing 1. The complete SOAP client /* * SOAPClient4XG. Read the SOAP envelope file passed as the second * parameter, p
8、ass it to the SOAP endpoint passed as the first parameter, and * print out the SOAP envelope passed as a response. with help from Michael * Brennan 03/09/01 * * * author Bob DuCharme * version 1.1 * param SOAPUrl URL of SOAP Endpoint to send request. * param xmlFile2Send A file with an XML document
9、of the request. * * 5/23/01 revision: SOAPAction added*/import java.io.*;import .*;public class SOAPClient4XG public static void main(String args) throws Exception if (args.length < 2) System.err.println("Usage: java SOAPClient4XG " + "http:/soapURL soapEnvelopefile.xml" + &qu
10、ot; SOAPAction");System.err.println("SOAPAction is optional."); System.exit(1); String SOAPUrl = args0; String xmlFile2Send = args1; String SOAPAction = "" if (args.length > 2) SOAPAction = args2; / Create the connection where we're going to send the file. URL url = n
11、ew URL(SOAPUrl); URLConnection connection = url.openConnection(); HttpURLConnection httpConn = (HttpURLConnection) connection; / Open the input file. After we copy it to a byte array, we can see / how big it is so that we can set the HTTP Cotent-Length / property. (See complete e-mail below for more
12、 on this.) FileInputStream fin = new FileInputStream(xmlFile2Send); ByteArrayOutputStream bout = new ByteArrayOutputStream(); / Copy the SOAP file to the open connection. copy(fin,bout); fin.close(); byte b = bout.toByteArray(); / Set the appropriate HTTP parameters. httpConn.setRequestProperty( &qu
13、ot;Content-Length", String.valueOf( b.length ) ); httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8"); httpConn.setRequestProperty("SOAPAction",SOAPAction); httpConn.setRequestMethod( "POST" ); httpConn.setDoOutput(true); httpConn.setDoI
14、nput(true); / Everything's set up; send the XML that was read in to b. OutputStream out = httpConn.getOutputStream(); out.write( b ); out.close(); / Read the response and write it to standard out. InputStreamReader isr = new InputStreamReader(httpConn.getInputStream(); BufferedReader in = new Bu
15、fferedReader(isr); String inputLine; while (inputLine = in.readLine() != null) System.out.println(inputLine); in.close(); / copy method from From E.R. Harold's book "Java I/O" public static void copy(InputStream in, OutputStream out) throws IOException / do not allow other threads to r
16、ead from the / input or write to the output while copying is / taking place synchronized (in) synchronized (out) byte buffer = new byte256; while (true) int bytesRead = in.read(buffer); if (bytesRead = -1) break; out.write(buffer, 0, bytesRead); 因为该 SOAP 客户机使用 HTTP 协议发送 XML SOAP 请求,所以大量必需做的工作就是 HTTP
17、 设置。Java 提供了一个 HttpURLConnection 类,它有许多“设置”方法来正确设置每个 HTTP 参数,并且可以用简单的字符串来设置大多数参数。需要一点额外代码的一个 HTTP 参数是 Content-Length,所以SoapClient4XG通过在读取XML请求之后将它放到一个字节数组中,然后检查字节数组的长度特性来计算XML请求的长度。 可使用其它会代您设置这些 HTTP 参数的 HTTP 实现。Sun 开放源码的 Brazil Web 应用程序框架(请参阅参考资料)会自动处理 HTTP 问题, 并使处理适当 SOAP 错误更为容易,因为(不象早期的 HttpURLCo
18、nnection 类)它是一个没有经过特定编写以用 Java 小应用程序减轻装入图像和其它 Web 资源工作的通用 HTTP 类。 运行它X(请参阅参考资料)提供了一份在不断发展的公共可用 SOAP 服务列表。除了告诉您可选 SOAP 操作参数是否对每个服务是必需的之外,它们的许多描述还包括样本 XML 请求,所以我复制了对气温 SOAP 服务器的样本请求,添加了一些空白空间, 并在 zipcode 元素中替代了自己的邮政编码,如清单2所示。 清单2 Listing 2. SOAP XML Request to find out the temperature at zip code 1121
19、7 <SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" xmlns:xsi="/1999/XMLSchema-instance" xmlns:xsd="/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:getTemp xmlns:ns1="urn:xmethods-Temperature" SO
20、AP-ENV:encodingStyle="/soap/encoding/"> <zipcode xsi:type="xsd:string">11217</zipcode> </ns1:getTemp> </SOAP-ENV:Body></SOAP-ENV:Envelope> 这个文件存储在名为 weattherreq.xml 的文件中,清单3中的命令行将它的内容发送到我获得样本 XML 的同一个 XMethods Web 页面上指定的 S
21、OAP 端点 URL。 清单3 Listing 3. Using SOAPClient4XG to send the SOAP request java SOAPClient4XG :80/soap/servlet/rpcrouter weatherreq.xml 如清单4中所示,SOAP 服务器发回 SOAP 响应,其中,当前温度存储在 response 元素中。 清单4 Listing 4. Temperature SOAP server's response <?xml version='1.0' encoding='UTF-8'?>&
22、lt;SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" xmlns:xsi="/1999/XMLSchema-instance" xmlns:xsd="/1999/XMLSchema"><SOAP-ENV:Body><ns1:getTempResponse xmlns:ns1="urn:xmethods-Temperature" SOAP-ENV:encodingStyle="/soap/encoding/"><return xsi:type="xsd:float">50.0</return></ns1:getTempResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 因为这个 SOAP 客户机从您创建的 XML 文档文件(而不是从暗中为您
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度室内外地板一体化设计与施工合同3篇
- 课题申报参考:民事非法定种类证据的实质审查机制研究
- 课题申报参考:面向金融大数据的联邦深度欺诈检测方法研究
- 二零二五版文化产业园规划设计与建设合同3篇
- 二零二五版木工企业员工离职与竞业禁止劳动合同3篇
- 2025年度个人营运汽车租赁车辆安全监控系统合同4篇
- 二零二五年度绿色节能幕墙安装服务合同文本4篇
- 2024露天煤矿开采项目咨询与服务合同范本3篇
- 2025年度木工班组安全生产标准化建设合同3篇
- 2025年度个人别墅防水系统安装合同范本
- 河北省保定市定州市2025届高二数学第一学期期末监测试题含解析
- 中医护理人文
- 2024-2030年中国路亚用品市场销售模式与竞争前景分析报告
- 中国2型糖尿病运动治疗指南 (2024版)
- 货物运输安全培训课件
- 统编版高中政治选择性必修2《法律与生活》知识点复习提纲详细版
- 前端年终述职报告
- 2024小说推文行业白皮书
- 特殊感染手术管理考试试题及答案
- 市人民医院关于开展“改善就医感受提升患者体验主题活动”2023-2025年实施方案及资料汇编
- 政绩观存在的问题及整改措施范文(7篇)
评论
0/150
提交评论