SAAJ(SOAP with Attachments API for Java) 是在松散耦合软件系统中基于SOAP协议利用XML传递消息的API规.
简单案例
发送SOAP工具类util.SOAPUtil.java
package util;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
public class SOAPUtil {
private SOAPUtil(){}
public static SOAPUtil newInstance(){
return new SOAPUtil();
}
// prepare the request xml
private SOAPMessage prepareMessage(String requestXml){
try {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage requestMessage = messageFactory.createMessage();
SOAPPart soapPart = requestMessage.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
body.addTextNode(requestXml);
return requestMessage;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// get the response xml from response SOAPMessage
private String detachResponseXml(SOAPMessage responseMessage){
try {
return responseMessage.getSOAPPart().getEnvelope().getBody().getTextContent();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// connect the remote webservice and return the response xml
public String fireCall(String requestXml,String url){
try {
SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = soapConnFactory.createConnection();
SOAPMessage requestMessage=prepareMessage(requestXml);
SOAPMessage responseMessage=connection.call(requestMessage, url);
connection.close();
return detachResponseXml(responseMessage);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
服务类servlets.SOAPResponseServlet.java
package servlets;
import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
public class SOAPResponseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// print the request information
BufferedReader reader=request.getReader();
String text=null;
System.out.println("below is the request information");
while((text=reader.readLine())!=null){
System.out.println(text);
}
// return the response
try {
response.setHeader("Content-Type", "text/xml");
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
// Add content
body.addTextNode("<message>This is the response.</message>");
// print the response information
message.writeTo(System.out);
message.writeTo(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
web服务端web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>SOAPResponseServlet</servlet-name> <servlet-class>servlets.SOAPResponseServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SOAPResponseServlet</servlet-name> <url-pattern>/servlet/SOAPResponseServlet</url-pattern> </servlet-mapping> </web-app>
测试类test.Main.java
package test;
import util.SOAPUtil;
public class Main {
public static void main(String[] args) throws Exception {
String requestXml = "<message>This is a request.</message>";
String url = "http://localhost:8080/WebServer/servlet/SOAPResponseServlet";
String responseXml = SOAPUtil.newInstance().fireCall(requestXml, url);
System.out.println(responseXml);
}
}
Note:发送的request xml消息如下
<SOAP-ENV:Envelope><SOAP-ENV:Header/><SOAP-ENV:Body><message>This is a request.</message></SOAP-ENV:Body></SOAP-ENV:Envelope>
接收的response xml消息如下
<SOAP-ENV:Envelope><SOAP-ENV:Header/><SOAP-ENV:Body><person><message>This is the response.</message></person></SOAP-ENV:Body></SOAP-ENV:Envelope>
案例数据运行流程:
1) 客户端将xml消息装载到http协议中的字节流中,发送到服务器。
2) 服务器解析字节流中信息,并返回数据
3) 客户端解析返回的数据