转自:https://www.cnblogs.com/chenying99/archive/2013/05/23/3094128.html
技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化

简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM))简化创建和发送 SOAP 消息的过程。

Web 服务的基础在于以标准格式发送和接收消息以便使所有系统都能理解。通常,那种格式是简单对象访问协议(Simple Object Access Protocol (SOAP))。SOAP 消息可以手工生成和发送,但是用于 XML 消息传递的 Java API(JAXM)使许多必需步骤(如创建连接或创建并发送实际消息)自动化。这篇技巧文章记录了一个同步 SOAP 消息的创建和发送。

这个过程包含五个步骤:

  1. 创建 SOAP 连接
  2. 创建 SOAP 消息
  3. 填充消息
  4. 发送消息
  5. 检索应答

JAXM 可以作为 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2(请参阅 参考资料)的一部分而获得。后者还包含了一份 Tomcat Web 服务器以及样本应用程序的副本。那些样本 Web 服务之一作为本技巧文章中 SOAP 消息的目的地,这个例子中实际服务的内容和功能却不是很重要。

SOAP 消息结构

一个基本的 SOAP 消息由包含两个主要部分(报头和主体)的封套组成。应用程序决定如何使用这些部分,但整个消息必须遵循特定的 XML 结构,例如:

样本 SOAP 消息

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><soap-env:Header/><soap-env:Body><cal:schedule xmlns:cal="http://www.example.com/calendar"><cal:newitem><cal:eventDate>4/10/2002</cal:eventDate><cal:title>Fun With Frogs</cal:title></cal:newitem></cal:schedule></soap-env:Body>
</soap-env:Envelope>

在这个例子中,报头为空,而主体包含目的地为一个日历应用程序的信息。

请注意这个消息的结构。Envelope 包含 Header 和 Body 元素,而三者全都是 http://schemas.xmlsoap.org/soap/envelope/ 名称空间的一部分。整个消息将通过一个 SOAP 连接发送到一个 Web 服务中。

回页首

创建连接和消息

第一步是创建整个类和连接:

创建连接

import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
public class SOAPTip {public static void main(String args[]) {try {//First create the connectionSOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance();SOAPConnection connection = soapConnFactory.createConnection();//Close the connection            connection.close();} catch(Exception e) {System.out.println(e.getMessage());}}
}

SOAP 消息可以通过使用 SOAPConnection 直接发送,或使用消息传递提供程序间接发送。在这个例子中,应用程序通过使用工厂(factory)创建 SOAPConnection 对象。

工厂也创建消息本身:

创建消息对象

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 connectionSOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance();SOAPConnection connection = soapConnFactory.createConnection();//Next, create the actual messageMessageFactory 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 )的引用。

接着,填充 SOAPBody :

填充主体

...
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 namespaceSOAPElement bodyElement = body.addChildElement(envelope.createName("schedule" , "cal", "http://www.example.com/calendar"));//Add contentbodyElement.addChildElement("cal:newitem").addTextNode("contentHere");//Save the messagemessage.saveChanges();//Check the inputSystem.out.println("\nREQUEST:\n");message.writeTo(System.out);System.out.println();//Close the connection            connection.close();} catch(Exception e) {System.out.println(e.getMessage());}}
}

SOAP 消息的主体就象任何其它 XML 元素,您可以在其中添加子元素(如 schedule 元素)。通常,您可以使用 addChildElement(elementname,但是这里演示的 envelope.createName() 方法使用用于数据或有效负载的名称空间声明简化了元素的创建。的确,创建 schedule 元素从而创建了 bodyElement SOAPElement 对象。然后, bodyElement 对象可以给其自己的子元素 cal:newitem 添加其自己的文本节点。通过这种方式,您可以象构建任何其它 XML 文档一样构建 XML 结构。

然而,使用 JAXM,您也有机会通过使用外部文件直接创建消息的 SOAPPart 。例如,第一个清单中的 XML 结构保存在文件prepped.msg 中,而且可以调用它来替代手工构建文档。

从外部文件创建消息

...
import javax.xml.soap.SOAPElement;
import java.io.FileInputStream;
import javax.xml.transform.stream.StreamSource;
public class SOAPTip {public static void main(String args[]) {
...//Create objects for the message parts            SOAPPart soapPart =     message.getSOAPPart();SOAPEnvelope envelope = soapPart.getEnvelope();SOAPBody body =         envelope.getBody();//Populate the MessageStreamSource preppedMsgSrc = new StreamSource( new FileInputStream("prepped.msg"));soapPart.setContent(preppedMsgSrc);//Save the messagemessage.saveChanges();
...}
}

结果就是准备发送的 SOAP 消息。

回页首

发送消息

对于同步消息,发送 SOAP 消息和接收应答是在单个步骤中发生的:

发送消息

...
import javax.xml.messaging.URLEndpoint;
public class SOAPTip {public static void main(String args[]) {...//Check the inputSystem.out.println("\nREQUEST:\n");message.writeTo(System.out);System.out.println();//Send the message and get a reply   //Set the destinationURLEndpoint destination = new URLEndpoint("http://localhost:8080/jaxm-simple/receiver");//Send the messageSOAPMessage reply = connection.call(message, destination);//Close the connection            connection.close();
...}
}

实际的消息是使用 call() 方法发送的,该方法把消息本身和目的地作为参数,然后返回第二个 SOAPMessage 作为应答。目的地必须是一个 Endpoint 对象,或者是这个例子中的 URLEndpoint 。这个示例使用来自 JWSDP 的一个样本 servlet,它只用于获取响应。

call() 方法一直处于阻塞状态,直到它接收到返回的 SOAPMessage 为止。

回页首

响应

返回的 SOAPMessage ― reply ― 是 SOAP 消息,它与已发送的消息格式相同,因此可以象操作任何其它 XML 消息那样操作它。SOAP 允许您通过使用 XSLT 直接转换应答:

读取响应

...
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamResult;
public class SOAPTip {public static void main(String args[]) {try {...//Send the messageSOAPMessage reply = connection.call(message, destination);//Check the outputSystem.out.println("\nRESPONSE:\n");//Create the transformerTransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();//Extract the content of the replySource sourceContent = reply.getSOAPPart().getContent();//Set the output for the transformationStreamResult result = new StreamResult(System.out);transformer.transform(sourceContent, result);System.out.println();//Close the connection            connection.close();
...            }
}

象在任何 XSLT 应用程序中那样创建 Transformer 对象。在这个例子中,我们只希望输出内容,所以没有用到样式表。这里,内容本身就是消息的整个 SOAP 部分(与可能包含附件的 SOAP 消息本身不同)。您还可以在处理之前抽取封套和主体。这个例子中的结果只是 System.out ,但它可以是通常用于转换的任何选择。照常进行转换。

图 1. SOAP 请求和响应 

回页首

下一步

虽然本示例中的端点是提供静态响应的 servlet,但是实际的响应取决于服务的功能和请求的性质。同时,虽然本篇技巧文章演示了消息的同步发送和接收,但是通过使用 ProviderConnection 对象而不是 SOAPConnection ,JAXM 允许使用消息传递提供程序进行异步发送。该提供程序一直保存这个消息,直到成功发送消息为止。

JAXM 还允许使用 profile,这样很容易创建诸如 SOAP-RP 或 ebXML 消息那样的专门 SOAP 消息,而且还能使非 XML 附件能够附加到 SOAP 消息中。

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
  • 请查看 W3C中的各种与 Web 服务相关的建议书的情况。
  • JAXM 可以作为 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2的一部分而获得。
  • IBM WebSphere Studio Application Developer是用于构建、测试和部署 Web 服务的易用的集成开发环境。
  • 要获取完整的 Web 服务工具箱,请下载 IBM 的 Web Services Development Kit。
  • 在 developerWorks 的 XML和 Web 服务专区查找更多参考资料。

转载:http://www.ibm.com/developerworks/cn/xml/tips/x-jaxmsoap/

转载于:https://www.cnblogs.com/sharpest/p/7872708.html

2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...相关推荐

  1. 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...

    简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...

  2. 传说中的WCF(4):发送和接收SOAP头

    如果你实在不明白Header是个啥玩意儿,你就想一想你发送电子邮件时,是不是有个叫"附件"的东东?对啊,那么SOAP头是不是可以理解为一种附加信息?就是附加到消息正文的内容. 消息 ...

  3. 超声波传感器特性测量:发送与接收传感器之间的差异

    简 介: 本文针对超声波传感器的测量方法,探讨了使用NanoVNA测量过程, 对比发射和接收传感器在特性方面的不同. 对于整个过程编写了APPLE脚本. 关键词: 超声波传感器,发送,接收,NanoV ...

  4. Android深入四大组件(八)广播的注册、发送和接收过程

    前言 我们接着来学习Android四大组件中的BroadcastReceiver,广播主要就是分为注册.接收和发送过程.建议阅读此文前请先阅读Android深入理解四大组件系列的文章,知识重复的部分, ...

  5. python同时发送与接收_Python如何发送与接收大型数组

    问题 你要通过网络连接发送和接受连续数据的大型数组,并尽量减少数据的复制操作. 解决方案 下面的函数利用 memoryviews 来发送和接受大数组: # zerocopy.py def send_f ...

  6. 6、基带信号的发送和接收

    6.1.脉冲成形 什么是基带信号? 信源(信息源,也称发送端)发出的没有经过调制(即进行频谱搬移和变换)的原始电信号,其特点是频率较低,信号频谱从零频附近开始,具有低通形式.根据原始电信号的特征,基带 ...

  7. python串口发送数据_第六课python来写串口助手-串口发送数据

    https://m.toutiaocdn.com/group/6716026491689239044/?app=news_article&timestamp=1563807838&re ...

  8. java公众号上传素材及发送图文消息实现

    微信公众号先上传素材,再推送消息java代码实现: 首先公众号的图文消息是可以登录公众号,然后去管理--素材管理  下面去手动添加图文,图片,视频,音乐素材的.这样添加的素材属于永久素材. 用java ...

  9. ASP.NET之SOAP的发送、接收与处理类 [转载]

    首先本文不对SOAP有过多的解释,你只需知道它是--简单对象访问协议,一种轻量的.简单的.基于 XML 的协议.举个例子,WebService其实就基于SOAP的. 如果你需要了解SOAP的运行机制, ...

  10. python接收邮件内容启动程序_Python实现发送与接收邮件的方法详解

    本文实例讲述了Python实现发送与接收邮件的方法.分享给大家供大家参考,具体如下: 一.发送邮件 这里实现给网易邮箱发送邮件功能: import smtplib import tkinter cla ...

最新文章

  1. NLP学习 资料总结
  2. python 进阶:修饰器的介绍
  3. python-深浅copy-18
  4. 遮掩java_关于java中的覆写、重载、隐藏、遮掩、遮蔽
  5. 导入表编程-枚举导入表
  6. 初学__Python——Python 可重用结构:Python模块
  7. ant4 多个form 验证_ant-design表单处理和常用方法及自定义验证操作
  8. BZOJ 3910 并查集+线段树合并
  9. 百度大数据可视化产品矩阵
  10. mpvue 小程序下拉刷新 三个点那种
  11. python网络爬虫软件哪个好用_好好学Python,入门网络爬虫之精华版!
  12. 短视频直播一对一源码“皇冠”花落谁家
  13. 电脑小问题四:知网CAJ格式转下载PDF格式
  14. MAML小样本学习算法解读及基于飞桨的代码实现
  15. 百度html模板引擎,百度JS模板引擎 baiduTemplate
  16. 文件分配方式-索引分配
  17. 机器学习—确定系数R2
  18. C#使用Thread.Sleep()导致程序无响应的解决办法
  19. 基于FPGA的LED全彩图形显示控制器设计
  20. 年薪百万的年轻人都是怎样生活的

热门文章

  1. 关于UIText换行
  2. 偶像dd_engi 的学习之路《转》
  3. Tyvj-Begin P1029 Begin1 - Unit6 - 幼稚的把戏
  4. 可能促使您决定创建自定义数据绑定控件的一些原因:
  5. github git clone ssh协议 clone超慢解决方案,提高Github Clone速度
  6. mysql 修改字符集为utf8mb4
  7. Selenium2(WebDriver)总结(一)---启动浏览器、设置profile加载插件
  8. C++结构体字节对齐
  9. svg的viewport和viewbox
  10. Hat’s Words (分成两个字符串考虑)