莱芜信息港
汽车
当前位置:首页 > 汽车

Web服务规范SOAP之构建SOAP客户机

发布时间:2019-09-15 23:05:29 编辑:笔名

现在让我们开始构建实际的实现。首先从客户机开始。  以前的老方式

初出现用于使用 SOAP 消息的 Java API 时,其用途非常特定化。它们的用途相当直接,用于创建 SOAP 消息。需要创建消息、Envelope、Header、Body 等等。例如,可以构建“旧式”客户机来访问前面安装的 MyService 服务的 echo 函数(请参见清单 15)。

注意:为了编译并运行此客户机,将需要 SAAJ 实现(如原始 Axis 软件)。可以从 http://ws.apache.org/axis/ 下载 Axis。据说 Axis2 0.95 也包含此实现,但本教程未针对其进行测试。

清单 15. 旧式 SOAP 客户机

import javax.xml.SOAP.*;

import javax.xml.transform.*;

import java.io.FileInputStream;

import javax.xml.transform.stream.*;

import org.w3c.dom.*;

public class SendSOAP {

public static void main(String args[]) {

try {

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();

SOAPElement bodyElement =

body.addChildElement(envelope.createName("echo",

"req", "http://localhost:8080/axis2/services/MyService/"));

bodyElement.addChildElement("category")

.addTextNode("classifieds");

message.saveChanges();

SOAPPart SOAPpartbefore = message.getSOAPPart();

SOAPEnvelope reqenv = SOAPpartbefore.getEnvelope();

System.out.println("REQUEST:");

System.out.println(reqenv.toString());

//Now create the connection

SOAPConnectionFactory SOAPConnFactory =

SOAPConnectionFactory.newInstance();

SOAPConnection connection =

SOAPConnFactory.createConnection();

SOAPMessage reply = connection.call(message,

"http://localhost:8080/axis2/services/MyService");

SOAPPart SOAPpart = reply.getSOAPPart();

SOAPEnvelope replyenv = SOAPpart.getEnvelope();

System.out.println("\nRESPONSE:");

System.out.println(replyenv.toString());

connection.close();

} catch (Exception e){

System.out.println(e.getMessage());

}

}

}

请注意,您要直接创建 SOAPEnvelope、SOAPBody 等内容。可以向消息体添加 echo 和 category 等元素。将从其中创建连接,进行调用,同样也能遍历 SOAP 消息的结构来获取实际的内容。如果要运行此客户机,应该看到与清单 16 中所示类似的响应。

清单 16. 当时的客户机

REQUEST:

<SOAPenv:Envelope xmlns:SOAPenv=

"http://schemas.xmlSOAP.org/SOAP/envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<SOAPenv:Body>

<req:echo xmlns:req=

"http://localhost:8080/axis2/services/MyService/">

<req:category>classifieds</req:category>

</req:echo>

</SOAPenv:Body>

</SOAPenv:Envelope>

RESPONSE:

<SOAPenv:Envelope xmlns:SOAPenv=

"http://schemas.xmlSOAP.org/SOAP/envelope/" xmlns:wsa=

"http://schemas.xmlSOAP.org/ws/2004/08/addressing">

<SOAPenv:Header>

<wsa:ReplyTo>

<wsa:Address>

http://schemas.xmlSOAP.org/ws/2004/08/addressing/role/anonymous

</wsa:Address>

</wsa:ReplyTo>

<wsa:From>

<wsa:Address>

http://localhost:8080/axis2/services/MyService</wsa:Address>

</wsa:From>

<wsa:MessageID>ECE5B3F187F29D28BC11433905662036</wsa:MessageID>

</SOAPenv:Header>

<SOAPenv:Body>

<req:echo xmlns:req=

"http://localhost:8080/axis2/services/MyService/">

<req:category>classifieds</req:category>

</req:echo>

</SOAPenv:Body>

</SOAPenv:Envelope>

echo 服务所进行的所有工作实际就是对其所接收到的请求进行应答,通过这一点可以很好地了解旧式处理方法与新式处理方法间的差别。接下来让我们看看二者的差异。

新方式

现在越来越趋向于对程序员隐藏使用基于 XML 的 Web 服务消息的复杂性。为此进行了大量的工作,其中大部分的目标都是希望尽可能让 Web 服务编程与任何其他体系结构的编程工作一样进行。

在 Axis2 中,实际上并不仅限于此。Axis2 引入了一种全新的方式来使用表示 SOAP 消息的 XML(尽管表面看来与使用文档对象模型类似)。AxIs 对象模型(Axis Object Model,AXIOM)进行了一系列更改,但我暂时将仅提一下其对消息的信息集的关注,消息集是元素和属性中包含的实际信息,而不是通常看到的序列化版本。不过,更为重要的是,Axis2 将为您处理 SOAP 信封,从而可以将精力放在构建有效负载上(或者,如果是实际的服务,则是分析有效负载和创建响应)。接下来让我们看看如何进行此工作。

什么原因引起腹胀
什么原因造成小便后刺痛
宝宝便秘吃什么
为什么夜间孩子容易发烧
友情链接