设为首页收藏本站language 语言切换
查看: 1486|回复: 0
收起左侧

技巧:用JAXM发送和接收SOAP消息

[复制链接]
发表于 2010-2-25 10:27:47 | 显示全部楼层 |阅读模式
<p >在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于XML消息传递的 Java API(Java API for XML Messaging (JAXM))简化创建和发送 SOAP 消息的过程。<p >Web 服务的基础在于以标准格式发送和接收消息以便使所有系统都能理解。通常,那种格式是简单对象访问协议(Simple Object Access Protocol (SOAP))。SOAP 消息可以手工生成和发送,但是用于 XML 消息传递的 Java API(JAXM)使许多必需步骤(如创建连接或创建并发送实际消息)自动化。这篇技巧文章记录了一个同步 SOAP 消息的创建和发送。<p >这个过程包括创建 SOAP 连接、创建 SOAP 消息、填充消息、发送消息、检索应答。<p >JAXM 可以作为 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2(请参阅参考资料)的一部分而获得。后者还包含了一份 Tomcat Web 服务器以及样本应用程序的副本。那些样本 Web 服务之一作为本技巧文章中 SOAP 消息的目的地,这个例子中实际服务的内容和功能却不是很重要。<p ><center><font color="#000099"><strong>SOAP 消息结构</strong></font></center><p >一个基本的SOAP消息由包含两个主要部分(报头和主体)的封套组成。应用程序决定如何使用这些部分,但整个消息必须遵循特定的 XML 结构,例如:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>样本 SOAP 消息&lt;soap-env:Envelope xmlns:soap-env=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;    &lt;soap-env:Header/&gt;    &lt;soap-env:Body&gt;        &lt;cal:schedule xmlns:cal=&quot;http://www.example.com/calendar&quot;&gt;            &lt;cal:newitem&gt;                &lt;cal:eventDate&gt;4/10/2002&lt;/cal:eventDate&gt;                &lt;cal:title&gt;Fun With Frogs&lt;/cal:title&gt;            &lt;/cal:newitem&gt;        &lt;/cal:schedule&gt;    &lt;/soap-env:Body&gt;&lt;/soap-env:Envelope&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p >在这个例子中,报头为空,而主体包含目的地为一个日历应用程序的信息。<p >请注意这个消息的结构。Envelope 包含 Header 和 Body 元素,而三者全都是 http://schemas.xmlsoap.org/soap/envelope/ 名称空间的一部分。整个消息将通过一个 SOAP 连接发送到一个 Web 服务中。<p ><center><font color="#000099"><strong>创建连接和消息</strong></font></center><p >第一步是创建整个类和连接:<p ><b>创建连接</b><p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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());        }    }}</ccid_code></pre></td></tr></table></ccid_nobr><p >SOAP消息可以通过使用SOAPConnection直接发送,或使用消息传递提供程序间接发送。在这个例子中,应用程序通过使用工厂(factory)创建 SOAPConnection 对象。<p >工厂也创建消息本身:<p ><b>创建消息对象</b><p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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());        }    }}</ccid_code></pre></td></tr></table></ccid_nobr><p >首先,通过使用 MessageFactory 来创建消息本身。这个消息已包含如 envelope 和 header 等基本部分的空白版本。SOAPPart 包含 envelope,而 envelope 包含主体。同时创建所需对象(如 SOAPBody)的引用。<p >接着,填充 SOAPBody:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>填充主体...import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPElement;public class SOAPTip {   public static void main(String args[]) {      try {...         //Create objects for the message parts                     SOAPPart soapPart =     message.getSOAPPart();         SOAPEnvelope envelope = soapPart.getEnvelope();         SOAPBody body =         envelope.getBody();        //Populate the body        //Create the main element and namespace        SOAPElement bodyElement =                   body.addChildElement(envelope.createName(&quot;schedule&quot; ,                                                                 &quot;cal&quot;,                                     &quot;http://www.example.com/calendar&quot;));        //Add content        bodyElement.addChildElement(&quot;cal:newitem&quot;).addTextNode(&quot;contentHere&quot;);        //Save the message        message.saveChanges();        //Check the input        System.out.println(&quot;\nREQUEST:\n&quot;);        message.writeTo(System.out);        System.out.println();         //Close the connection                     connection.close();        } catch(Exception e) {            System.out.println(e.getMessage());        }    }}</ccid_code></pre></td></tr></table></ccid_nobr><p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-10 15:09 , Processed in 0.063422 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表