如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM))简化创建和发送 SOAP 消息的过程。
Web 服务的基础在于以标准格式发送和接收消息以便使所有系统都能理解。通常,那种格式是简单对象访问协议(Simple Object Access Protocol (SOAP))。SOAP 消息可以手工生成和发送,但是用于 XML 消息传递的 Java API(JAXM)使许多必需步骤(如创建连接或创建并发送实际消息)自动化。
这个过程包含五个步骤:
创建 SOAP 连接
创建 SOAP 消息
填充消息
发送消息
检索应答
一个基本的 SOAP 消息由包含两个主要部分(报头和主体)的封套组成。应用程序决定如何使用这些部分,但整个消息必须遵循特定的XML 结构(soap.msg文件
):
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >
< soap:Body >
< ns1:SayHello xmlns:ns1 = " http://boomga.com " >
</ ns1:SayHello >
</ soap:Body >
</ soap:Envelope >
< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >
< soap:Body >
< ns1:SayHello xmlns:ns1 = " http://boomga.com " >
</ ns1:SayHello >
</ soap:Body >
</ soap:Envelope >
请注意这个消息的结构。Envelope 包含Body 元素,而二者全都是 http://schemas.xmlsoap.org/soap/envelope/ 名称空间的一部分。整个消息将通过一个 SOAP 连接发送到一个 Web 服务中。
public
static
void
doSoapPost()
{
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();
//Populate the Message
StreamSource preppedMsgSrc = new StreamSource(
new FileInputStream("E:\\soap.msg"));
soapPart.setContent(preppedMsgSrc);
//Save the message
message.saveChanges();
//Check the input
System.out.println("\nREQUEST:\n");
message.writeTo(System.out);
System.out.println();
//Send the message and get a reply
//Set the destination
String destination =
"http://localhost:8000/HelloWorld/services/HelloWorldService";
//Send the message
SOAPMessage reply = connection.call(message, destination);
// Check the output
System.out.println("\nRESPONSE:\n");
//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();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
{
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();
//Populate the Message
StreamSource preppedMsgSrc = new StreamSource(
new FileInputStream("E:\\soap.msg"));
soapPart.setContent(preppedMsgSrc);
//Save the message
message.saveChanges();
//Check the input
System.out.println("\nREQUEST:\n");
message.writeTo(System.out);
System.out.println();
//Send the message and get a reply
//Set the destination
String destination =
"http://localhost:8000/HelloWorld/services/HelloWorldService";
//Send the message
SOAPMessage reply = connection.call(message, destination);
// Check the output
System.out.println("\nRESPONSE:\n");
//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();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
运行结果:
REQUEST:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >
< soap:Body >
< ns1:SayHello xmlns:ns1 = " http://boomga.com " >
</ ns1:SayHello >
</ soap:Body >
</ soap:Envelope >
RESPONSE:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >< soap:Body >< ns1:SayHelloResponse xmlns:ns1 = " http://boomga.com " >< ns1: out > dyk,Hell0 </ ns1: out ></ ns1:SayHelloResponse ></ soap:Body ></ soap:Envelope >
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >
< soap:Body >
< ns1:SayHello xmlns:ns1 = " http://boomga.com " >
</ ns1:SayHello >
</ soap:Body >
</ soap:Envelope >
RESPONSE:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>< soap:Envelope xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd = " http://www.w3.org/2001/XMLSchema " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " >< soap:Body >< ns1:SayHelloResponse xmlns:ns1 = " http://boomga.com " >< ns1: out > dyk,Hell0 </ ns1: out ></ ns1:SayHelloResponse ></ soap:Body ></ soap:Envelope >