首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用SAAJ发送和接收SOAP消息(1)

使用SAAJ发送和接收SOAP消息(1)

Web 服务的基础是以标准格式发送和接收消息,这样所有系统都可以理解消息。通常情况下,这种标准格式是 SOAP。SOAP 消息可以手工生成和发送,但 SOAPwith Attachments API for Java (SAAJ)—— Java API for XML Messaging (JAXM)的一个分支——能够使许多必需的步骤变得自动化,例如创建连接,或者创建和发送实际消息。本技巧介绍了同步 SOAP 消息的创建和发送。
该过程包括 5 个步骤:
1. 创建 SOAP 连接        
2. 生成 SOAP 消息        
3. 填充消息        
4. 发送消息        
5. 检索响应        
SAAJ 是 Java Web Services Developer Pack 1.2 的一部分(参见 )。这个软件包还包含了 TomcatWeb 服务器(因此您就可以建立自己的服务)和例子应用程序。      
安装问题安装 Java Web Services Developer Pack 1.2 是很容易的——只要通过包含的 Tomcat Web 服务器发送消息即可。要通过独立的应用程序发送消息,像我这里所做的一样,需要采取以下步骤:
  • 将软件安装到相应目录中。
  • 如果您正使用 Java 1.4,需要用下载的软件覆盖相关的 XML 类。创建以下目录:         
    <JAVA_HOME>/jre/lib/endorsed
    并复制目录         
    <JWSDP_HOME>/jaxp/lib/endorsed
    中的文件到该目录下。(JAVA_HOME和JWSDP_HOME 分别表示 Java 安装以及 JWSDP 安装的目录。)
  • 将下列文件加入 classpath 中:
    • <JWSDP_HOME>/saaj/lib/saaj-api.jar
    • <JWSDP_HOME>/saaj/lib/saaj-impl.jar
    • <JWSDP_HOME>/jwsdp-shared/lib/commons-logging.jar
    • <JWSDP_HOME>/jwsdp-shared/lib/mail.jar
    • <JWSDP_HOME>/jwsdp-shared/lib/activation.jar
    • <JWSDP_HOME>/jaxp/lib/endorsed/dom.jar
    • <JWSDP_HOME>/jaxp/lib/endorsed/xercesImpl.jar
    • <JWSDP_HOME>/jaxp/lib/endorsed/sax.jar
    • <JWSDP_HOME>/jaxp/lib/endorsed/xalan.jar
现在您就可以使用独立的程序从自己系统的任意位置发送消息了。
SOPA 消息的结构首先来看消息自身的结构。一条基本的 SOAP 消息由带有两个主要部分的信封(envelope)构成:头部和主体。应用程序确定如何使用这些部分,但整个消息必须遵循特定的 XML 结构,例如:
清单1. 一条示例 SOAP 消息
1
2
3
4
5
6
7
8
9
10
11
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Header />
    <SOAP-ENV:Body>
        <ns1:getPrice xmlns:ns1="urn:xmethods-BNPriceCheck"
             SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                  <isbn xsi:type="xsd:string">0672324229</isbn>
        </ns1:getPrice>
            </SOAP-ENV:Body>
</SOAP-ENV:Envelope>




这里,头部是空的,而主体包含了有效信息,或要传递的消息。在本例中,它是请求某本书价格的消息。
注意消息的结构。Envelope 包含 Header 和 Body 元素,这三者都是http://schemas.xmlsoap.org/soap/envelope/namespace的一部分。应用程序使用 SOAPConnection 来发送消息。
创建连接和消息第一步是要创建总体类和连接:
清单2. 创建连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
public class SOAPTip {
     
   public static void main(String args[]) {
         
      try {
      
                 //First create the connection
         SOAPConnectionFactory soapConnFactory =
                            SOAPConnectionFactory.newInstance();
         SOAPConnection connection =
                             soapConnFactory.createConnection();
         
         //Close the connection            
         connection.close();
            
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}




应用程序可以直接使用 SOAPConnnection 或间接使用消息提供者来发送 SOAP 消息,现在 SOAPConnection 已经是 SAAJ 包的一部分了,而消息提供者仍然属于 JAXM 包。在本例中,应用程序使用工厂创建 SOAPConnection 对象。
工厂还创建了消息自身:
清单3. 创建消息对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
        import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;
public class SOAPTip {
     
   public static void main(String args[]) {
         
      try {
      
         //First create the connection
         SOAPConnectionFactory soapConnFactory =
                            SOAPConnectionFactory.newInstance();
         SOAPConnection connection =
                             soapConnFactory.createConnection();
         
  
                //Next, create the actual message
         MessageFactory messageFactory = MessageFactory.newInstance();
         SOAPMessage message = messageFactory.createMessage();
         
         //Create objects for the message parts            
         SOAPPart soapPart =     message.getSOAPPart();
         SOAPEnvelope envelope = soapPart.getEnvelope();
         SOAPBody body =         envelope.getBody();
         //Close the connection            
         connection.close();
            
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}




首先,使用 MessageFactory 创建消息自身。这一消息已经包含了空的基本部分,比如          envelope 和         header 。SOAPPart 包含了          envelope ,而          envelope 又包含了主体。创建对所需对象(比如 SOAPBody)的引用。
返回列表