SOAP,防火墙后面的RPC

--服务器端程序设计


进行服务器端程序设计可以分三步进行。在这里,我们把服务器端的程序称为一个“Service”。我不想把这个词翻译成中文,Cyfer中文词汇量太小,因为实在找不到一个合适的词。我们回到正题,第一步是写一个"Service"程序,第二步是为这个写好的"Service"程序写一个注册描述文件。第三步是把这个"Service"注册给SOAP。

首先我们来讨论如何写一个"Service"程序。在Apache-SOAP的服务器端,一个"Service"程序可以是一个普通的Java类,一个EJB,或者一个BSF支持的Script,关于BSF的内容可以参考前面关于Xalan扩展的内容。这个"Service"程序不需要知道Apache-SOAP的存在,可以认为是一个与SOAP完全无关的类库,Apache-SOAP将通过class.laodClass()方法来调用。我们仅仅需要把SOAP将要调用的方法声明为public就可以了。但是需要注意的是方法的参数要有限制。关于这些限制我们会在后面说明。到目前为止,我们知道基本的java数据类型和String都可以直接调用就可以了。但是"Service"程序可以通过抛出SOAPException的方法与SOAP进行交流。例如如果抛出一个SOAPException(Constants.FAULT_CODE_CLIENT, "Client've got something wrong")表明客户端发生了错误。其他可以使用的错误信息还有FAULT_CODE_MUST_UNDERSTAND, FAULT_CODE_PROTOCOL, FAULT_CODE_SERVER, FAULT_CODE_SERVER_BAD_TARGET_OBJECT_URI, FAULT_CODE_VERSION_MISMATCH。

第二步是为这个"Service"写一个描述文件。这个文件缺省使用DeploymentDescriptor.xml这个文件名。我们曾经讨论过这种文件,现在我们进行详细的介绍。这个xml文件中告诉了服务器需要响应的SOAP RPC方法的名字,以及方法的具体实现的类及方法的名字。同时这个文件还告诉了SOAP在调用方法的时候参数如何从xml文本转换为java数据类型,这个操作我们成为Serialize。下面的代码演示了如何使用标准的java class实现一个SOAP RPC调用。

<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:service-urn" [type="message"] [checkMustUnderstands="true|false"> <isd:provider type="java" scope="Request | Session | Application" methods="exposed-methods"> <isd:java class="implementing-class" [static="true|false"]/> </isd:provider> <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener> </isd:service>

这里service-urn是一个"Service"的urn名字, exposed-methods是一系列RPC方法的名字,implementing-class是一个java类的名字,这里要包含包的名字,例如a.b.c.class。在service标签里面有两个可选的属性,分别是type="message"和checkMustUnderstand="true|false"。这里如果方法是面向文档的而不是一个RPC调用的话就需要加上type="message"。

继续,继续。