用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)

本文详细介绍了如何使用Java实现基于SOAP的XML文档网络传输和远程过程调用(RPC)。首先,文章讨论了SOAP协议的基础,包括SOAP信封、数据编码规则、RPC协定和传输绑定。接着,通过一个购物订单的例子展示了XML如何转化为SOAP消息。此外,文章还涵盖了SOAP消息的发送和接收,以及SOAP-RPC的使用,包括方法签名、SOAP-Encoding属性和响应处理。最后,提供了SOAP-RPC发送端和接收端的Java代码示例。
摘要由CSDN通过智能技术生成

SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。SOAPWeb service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IPSOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。

SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。一般企业的防火墙都开放HTTP80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。

1. 环境配置

为了运行程序,我们首先必须配置好环境:

共要下载四个软件包,它们都是开源免费的。其中,前两个是Apache的,后两个是SUN网站的,如下所示:

n        SOAPhttp://apache.freelamp.com/ws/soap/version- 2.3.1 /

n        Xerceshttp://xml.apache.org/dist/xerces-j/  

n        JavaMailhttp://java.sun.com/products/javamail/downloads/index.html 

n        JAFhttp://java.sun.com/products/javabeans/glasgow/jaf.html 

下载后将它们分别解压缩。分别在这四个包的解压目录中找到:xerces.jarsoap.jarmail.jaractivation.jarJAF的),则是四个jar文件是我们所需要的。

本机安装环境:WindowsXP(SP2) + JDK 1.4.2 _06 + Tomcat5.0.28 + SOAP2.3.1

配置步骤:

1、安装JDKTomcat。过程比较简单,这里不再详述。

2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0/common/lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。

3、/ JDK 1.4.2 /lib/路径下的tools.jar也复制到Tomcat的“Tomcat 5.0/common/lib”目录下。

4、soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat 5.0/webapps”目录下,这个目录是TomcatWEB应用所在目录。重新启动TomcatTomcat会自动将其解压,并配置好路径。可以尝试在浏览器中输入“http://localhost:8080/soap/”, 看SOAP是否安装好。

5、注意在编写程序时,需要将所得到的四个jar文件路径设置到所使用的Java编程环境中,因为在程序中需要用到其中的类文件。具体步骤略。

6、重启Tomcat服务。这时Tomcat会将“Tomcat 5.0/common/lib”目录下新加入的包加载到内存中。

到此,我们已经配置好了程序运行所需要的环境。

 

2. 基于SOAPXML文档网络传输

SOAP规范主要定义了四个元素:SOAP信封规范,传输和协议绑定,编码规则和一个RPC协定。用于实现消息的网络传输。

n        SOAP信封规范,SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。这包括应用特定的数据,如要调用的方法名,方法参数和返回值;还包括谁将处理封装内容,失败时如何编码错误消息等信息。

n        数据编码规则,为了交换数据,计算机必须在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。大部分约定都基于W 3C XML Schema规范。

n        RPC协定,SOAP能用于单向和双向等各种消息接发系统。SOAP为双向消息接发定义了一个简单的协定来进行远程过程调用和响应,这使得客户端应用可以指定远程方法名,获取任意多个参数并接受来自服务器的响应。

n        传输和协议绑定,提供了更底层协议传输SOAP封套的一套通用机制。

而以上四个部分统称为一个SOAP消息。我们先来看一篇XML文档是如何变成SOAP的。采用一个简单的购物订单文件PO.xml 。内容为:

<?xml version="1.0" encoding="UTF-8"?>

<PurchaseOrder xmlns="urn:oreilly-jaws-samples">

    <shipTo country="US">

        <name>Joe Smith</name>

        <street>14 Oak Park </street>

        <city> Bedford </city>

        <state>MA</state>

        <zip>01730</zip>

    </shipTo>  

    <items>

        <item partNum="872-AA">

            <productName>Candy Canes</productName>

            <quantity>444</quantity>

            <price>1.68</price>

            <comment>I want candy!</comment>

        </item>

    </items>

</PurchaseOrder>

其对应的SOAP消息为:

POST /ServletTemp/HTTPReceive HTTP/1.0

Host: localhost

Content-Type: text/xml; charset=utf-8

Content-Length: 939

SOAPAction: "urn:oreilly-jaws-samples"

 

<?xml version='1.0' encoding='UTF-8'?>

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<SOAP-ENV:Header>

<jaws:MessageHeader xmlns:jaws="urn:oreilly-jaws-samples" SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="urn:oreilly-jaws-samples"><From>Me</From><To>You</To><MessageId>9999</MessageId></jaws:MessageHeader>

</SOAP-ENV:Header>

<SOAP-ENV:Body>

<PurchaseOrder xmlns="urn:oreilly-jaws-samples">

    <shipTo country="US">

        <name>Joe Smith</name>

        <street>14 Oak Park </street>

        <city> Bedford </city>

        <state>MA</state>

        <zip>01730</zip>

    </shipTo>

    <items>

        <item partNum="872-AA">

            <productName>Candy Canes</productName>

            <quantity>444</quantity>

            <price>1.68</price>

            <comment>I want candy!</comment>

        </item>

    </items>

</PurchaseOrder>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

一个SOAP消息包括:SOAP封套,SOAP(可选)SOAP主体。

我们首先将XML文档包装到一个SOAP体中,然后再把SOAP体包装到一个SOAP封套中,可以在封套中再添加一个SOAP(不是必须),最后将SOAP封套绑定到一个协议中。我们来仔细分析一下代码。

n       SOAP封套

SOAP封套的声明在XML标签的最外层,它表明了一个SOAP文档的边界。下面的封套标签显示了三个必要的属性,这些属性指明了封套中使用的名字空间和语法。

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 … …

</SOAP-ENV:Envelope>

其中第一个属性:xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 是一个名字空间声明,防止多个XML文件组合时发生标签名字的冲突。第二个属性声明了XML模式实例的名字空间。前缀xsi必须放在这个名字空间定义的所有元素和属性之前。最后一个属性是另外一个名字空间声明,它定义了XML Schema名字空间,这个名字空间下的元素用来指定xsi:type 属性的值(如xsd:string)。

n       SOAP

    SOAP头和体在语法上非常类似。SOAP1.1SOAP1.2都没有头里应该有些什么,它就是简单的存放一些指令,提供给接收消息的SOAP处理器。建立在SOAP之上的更高级协议(比如ebXML消息服务)就通过定义一些特殊元素来规范SOAP头的格式。另外当对RPC使用SOAP时,头部也可以用来表示一些底层信息。

<SOAP-ENV:Header>

<jaws:MessageHeader xmlns:jaws="urn:oreilly-jaws-samples" SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="urn:oreilly-jaws-samples"><From>Me</From><To>You</To><MessageId>9999</MessageId></jaws:MessageHeader>

</SOAP-ENV:Header>

 

n       SOAP主体

SOAP主体用来存放实际数据或消息的有效负载(本例中为XML文档),从而提供给最终的接受者使用或处理。

n       SOAP协议绑定

当绑定到一个HTTP协议时,需要在SOAP封套前面添加HTTP头的信息。

POST /ServletTemp/HTTPReceive HTTP/1.0

Host: localhost

Content-Type: text/xml; charset=utf-8

Content-Length: 939

SOAPAction: "urn:oreilly-jaws-samples"

SOAP1.1SOAPActionHTTP绑定所必须的部分,它的目的是让那些路由或分派的信息知道该做些什么,即使它们根本不知道SOAP或者没有解析SOAP封套的方法。而在SOAP1.2SOAPAction已变成可选的了。

n       SOAP消息的发送与接收

我们已经看到了一个SOAP消息的各个组成块,接下来我们要了解消息是怎样被创建的,以及怎样在两个端点之间进行传输的。

SOAP的发送端的代码:

package javaSoap01;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值