在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 xml 消息传递的 java API(Java API for XML Messaging (JAXM))简化创建和发送 SOAP 消息的过程。 Web 服务的基础在于以标准格式发送和接收消息以便使所有系统都能理解。通常,那种格式是简单对象访问协议(Simple Object accessPRotocol (SOAP))。SOAP 消息可以手工生成和发送,但是用于 XML 消息传递的 Java API(JAXM)使许多必需步骤(如创建连接或创建并发送实际消息)自动化。这篇技巧文章记录了一个同步 SOAP 消息的创建和发送。
这个过程包含五个步骤:
创建 SOAP 连接 创建 SOAP 消息 填充消息 发送消息 检索应答 JAXM 可以作为 Java XML Pack(2002 年春季版)的一部分和 Java Web Services Developer Pack EA2(请参阅参考资料)的一部分而获得。后者还包含了一份 Tomcat Web 服务器以及样本应用程序的副本。那些样本 Web 服务之一作为本技巧文章中 SOAP 消息的目的地,这个例子中实际服务的内容和功能却不是很重要。
SOAP 消息结构 一个基本的 SOAP 消息由包含两个主要部分(报头和主体)的封套组成。应用程序决定如何使用这些部分,但整个消息必须遵循特定的 XML 结构,例如:
//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();
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("schedule" , "cal", "http://www.example.com/calendar")); //Add content bodyElement.addChildElement("cal:newitem").addTextNode("contentHere");
//Save the message message.saveChanges();
//Check the input System.out.println(" REQUEST: "); message.writeTo(System.out); System.out.println();
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 Message StreamSource preppedMsgSrc = new StreamSource( new FileInputStream("prepped.msg")); soapPart.setContent(preppedMsgSrc);
//Save the message message.saveChanges(); ... } }
结果就是预备发送的 SOAP 消息。
发送消息 对于同步消息,发送 SOAP 消息和接收应答是在单个步骤中发生的:
发送消息 ... import javax.xml.messaging.URLEndpoint;
public class SOAPTip {
public static void main(String args[]) {
... //Check the input System.out.println(" REQUEST: "); message.writeTo(System.out); System.out.println();
//Send the message and get a reply
//Set the destination URLEndpoint destination = new URLEndpoint("http://localhost:8080/jaxm-simple/receiver"); //Send the message SOAPMessage reply = connection.call(message, destination);
//Close the connection connection.close(); ... } }
... //Send the message SOAPMessage reply = connection.call(message, destination);
//Check the output System.out.println(" RESPONSE: "); //Create the transformer TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); //Extract the content of the reply Source sourceContent = reply.getSOAPPart().getContent(); //Set the output for the transformation StreamResult result = new StreamResult(System.out); transformer.transform(sourceContent, result); System.out.println();
//Close the connection connection.close(); ... } }
请查看 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 服务专区查找更多参考资料。
关于作者 Nicholas Chase 一直在参与如 LUCent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers 等公司的网站开发。Nick 曾经是一位高中物理教师、低级放射性废物设备的治理员、在线科幻小说杂志的编辑、多媒体工程师和 Oracle 讲师。近来,他是佛罗里达州克利尔沃特 Site Dynamics Interactive Communications 的首席技术官,而且是有关 Web 开发的三本书,包括 Java and XML From Scratch(Que)和即将出版的 Primer Plus XML Programming(Sams)的作者。他愿意倾听读者的意见,可以通过 nicholas@nicholaschase.com 与他联系。