SOAP,防火墙后面的RPC

--SOAP是如何进行RPC的


下面是一个SOAP请求的例子,从这个例子我们可以基本上了解一个基于SOAP的RPC请求的框架。

首先是请求的例子:

POST /StockQuote HTTP/1.1 Host: www.stockquoteserver.com Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "Some-URI" <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetLastTradePrice xmlns:m="Some-URI"> <symbol>DIS</symbol> </m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

然后是相应的例子:

HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" Content-Length: nnnn <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <SOAP-ENV:Body> <m:GetLastTradePriceResponse xmlns:m="Some-URI"> <Price>34.5</Price> </m:GetLastTradePriceResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

在实际的使用中,在服务器端还需要有一个充当router的功能的程序运行,首先,我们要向这个router注册响应不同请求的java类或者其他任何类型的程序,然后这个程序通过http方式工作,响应上面演示的请求,根据请求的内容把请求转换成具体实现的程序语言的方法调用,最后把调用的结果或者错误信箱使用上面演示的方式返回给请求者,这样一次基于SOAP的rpc就完成了。这个router程序可以使用任何语言来实现,例如Perl,ASP等等,在Apache-SOAP中,一般是一个Servlet程序来充当router。

如果我们想要让router能够知道如何处理一个请求,我们首先要向router注册各种请求的处理方法。这些处理方法在Apache-SOAP中使用一个叫做DeploymentDescriptor.xml的xml文件来描述。下面是一个描述文件的例子。

<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:AddressFetcher"> <isd:provider type="java" scope="Application" methods="getAddressFromName addEntry getAllListings putListings"> <isd:java class="samples.addressbook.AddressBook" static="false"/> </isd:provider> <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener> <isd:mappings> <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:x="urn:xml-soap-address-demo" qname="x:address" javaType="samples.addressbook.Address" java2XMLClassName="org.apache.soap.encoding.soapenc.BeanSerializer" xml2JavaClassName="org.apache.soap.encoding.soapenc.BeanSerializer"/> <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:x="urn:xml-soap-address-demo" qname="x:phone" javaType="samples.addressbook.PhoneNumber" java2XMLClassName="org.apache.soap.encoding.soapenc.BeanSerializer" xml2JavaClassName="org.apache.soap.encoding.soapenc.BeanSerializer"/> </isd:mappings> </isd:service>

关于更详细的信息可以在“编写服务器程序”获得。