SAOP请求

SOAP请求工具类

package xxx.util;
 
import javax.xml.namespace.QName;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPException;
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.SOAPHeader;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.Service.Mode;
import javax.xml.ws.soap.SOAPBinding;
 
import java.net.URL;
import java.util.Map;
import java.util.Set;
 
import javax.activation.DataHandler;
 
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Node;
 
public class SoapSender {
    private MessageFactory msgFactory;
    private static SoapSender instance = new SoapSender();
     
    private  SoapSender(){
        try {
            //创建消息工厂
            msgFactory = MessageFactory.newInstance();
          } catch (SOAPException e) {
             e.printStackTrace();
             throw new RuntimeException(e);
          }
    }
    public static SoapSender getInstance() {
        return instance;
    }
    public MessageFactory getMessageFactory() {
        return msgFactory;
    }
    /* ******************* 以下是创建SOAPMessage*********************** */
    /**
     * 创建一个默认的SOAPMessage
     * @return
     */
    public SOAPMessage getMessage() throws SOAPException {
        return msgFactory.createMessage();
    }
    /**
     * 创建SOAPMessage
     * @param params
     * @return
     */
    public SOAPMessage getMessage(Map<String, String> params) throws SOAPException, Exception {
        // 创建消息对象
        SOAPMessage message = msgFactory.createMessage();
        // 获得一个SOAPPart对象
        SOAPPart soapPart = message.getSOAPPart();
        // 获得信封
        SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
 
//      // 获得消息头
//      SOAPHeader soapHeader = soapEnvelope.getHeader();
//      // 添加头元素
//      SOAPHeaderElement headerElement = soapHeader.addHeaderElement(soapEnvelope.createName("Fault", "soapenv","http://www.xxx.cn"));
//      headerElement.addTextNode("JWS0229043");
 
        // *****************创建soap消息主体*****************
        SOAPBody soapBody = soapEnvelope.getBody();
        // 添加消息主体
//      Name bodyName = soapEnvelope.createName("INFO", "SOAP-ENV","http://www.xxx.cn");
        Name bodyName = soapEnvelope.createName("INFO");
        SOAPBodyElement bodyElement = soapBody.addBodyElement(bodyName);
        Set<String> keys = params.keySet();
        int i = 0;
        for(String name:keys){
            Name eleName = soapEnvelope.createName(name);
            SOAPElement se = bodyElement.addChildElement(eleName);
//          se.addChildElement("ServiceCode").addTextNode("10000061");
            se.addTextNode(params.get(name));
            i++;
        }
        // *************************************************
 
//      // 添加SOAP附件
//      URL url = new URL("http://xxx/1.jpg");
//      DataHandler dataHandler = new DataHandler(url);//use the JAF
//      message.addAttachmentPart(message.createAttachmentPart(dataHandler));
 
        // 更新SOAP消息
        message.saveChanges();
        return message;
    }
    /**
     * 创建SOAPMessage
     * @param headers
     * @param filePath:soap格式文件路径
     * @return
     */
    public SOAPMessage getMessage(MimeHeaders headers, String filePath) throws IOException, SOAPException {
//      filePath = Thread.currentThread().getContextClassLoader().getResource("SOAPMessageResp.xml").getPath();
        InputStream is = new FileInputStream(filePath);
        SOAPMessage message = msgFactory.createMessage(headers, is);
        is.close();
        return message;
    }
    /* ******************* 以下是发送SOAP请求*********************** */
    /**
     * 发送SOAP请求
     * @param requestUrl
     * @param message
     */
    public void send(String requestUrl,SOAPMessage message) throws SOAPException, IOException {
        //创建SOAP连接
        SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
        SOAPConnection sc = scf.createConnection();
        /*
         * 实际的消息是使用 call()方法发送的,该方法接收消息本身和目的地作为参数,并返回第二个 SOAPMessage 作为响应。
         * call方法的message对象为发送的soap报文,url为mule配置的inbound端口地址。
         */
        URL urlEndpoint = new URL(requestUrl);
        // 响应消息
        SOAPMessage response = sc.call(message, urlEndpoint);
        // *************************************************
        if (response != null) {
            //输出SOAP消息到控制台
            System.out.println("Receive SOAP message:");
            response.writeTo(System.out);
        } else {
            System.err.println("No response received from partner!");
        }
        // *************************************************
        // 关闭连接
        sc.close();
    }
    public void send1(String requestUrl,SOAPMessage message) throws SOAPException, Exception{
        //创建SOAP连接
        SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
        SOAPConnection sc = scf.createConnection();
        //发送SOAP消息到目的地,并返回一个消息
        URL urlEndpoint = new URL(requestUrl);
        SOAPMessage response = sc.call(message, urlEndpoint);
        // *************************************************
        response.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");
        // 打印服务端返回的soap报文供测试
        System.out.println("Receive SOAP message:");
        // 创建soap消息转换对象
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        // 提取消息内容
        Source sourceContent = response.getSOAPPart().getContent();
        // Set the output for the transformation
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
        // *************************************************
        // 关闭连接
        sc.close();
 
        // *************************************************
        /* 模拟客户端A,异常处理测试*/
        SOAPBody ycBody = response.getSOAPBody();
        Node ycResp = ycBody.getFirstChild();
        System.out.print("returnValue:"+ycResp.getTextContent());
    }
    /**
     * 发送SOAP请求
    public void send1(String requestUrl,SOAPMessage request) {
        //定义serviceName对应的QName,第一个参数是对应的namespace
        QName serviceName = new QName("http://xxx.com/", "SOAPMessageService");
        //定义portName对应的QName
        QName portName = new QName("http://xxx.com/", "SOAPMessagePort");
        //使用serviceName创建一个Service对象,该对象还不能直接跟WebService对象进行交互
        Service service = Service.create(serviceName);
//      //指定wsdl文件的位置
//      URL wsdl = new URL("http://localhost:8080/test/jaxws/services/SOAPMessage?wsdl");
//      Service service = Service.create(wsdl, serviceName);
        //创建一个port,并指定WebService的地址,指定地址后我们就可以创建Dispatch了。
        service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, requestUrl);
        //创建一个Dispatch对象
        Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Mode.MESSAGE);
        //调用Dispatch的invoke方法,发送一个SOAPMessage请求,并返回一个SOAPMessage响应。
        SOAPMessage response = dispatch.invoke(request);
        System.out.println("服务端返回如下: ");
        try {
            response.writeTo(System.out);
        } catch (Exception e) {}
    }
     */
 
}

  

  测试方法

public static void main(String[] args) throws SOAPException, Exception {
         
        Map<String, String> params = new HashMap<String, String>();
        params.put("a","1");
 
        String string="http://xxx/xxx";
         
        /** *************以下是SOAP请求***************** */
        SoapSender sender = SoapSender.getInstance();
 
        SOAPMessage message = sender.getMessage();
//      SOAPMessage message = sender.getMessage(params);
//      SOAPMessage message = sender.getMessage(null,"D:\SOAPMessageResp.xml");
        message.writeTo(System.out);
        sender.send(string,message);
         
    }

  

/*******************************************************************************************/

服务端:

package server;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;

import org.w3c.dom.Node;
import javax.xml.messaging.JAXMServlet;
import javax.xml.messaging.ReqRespListener;

public class ServerAction extends JAXMServlet implements ReqRespListener {
	static MessageFactory mf = null;
	// 创建一个消息工厂
	static {
		try {
			mf = MessageFactory.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	};

	public void init(ServletConfig sc) throws ServletException {
		super.init(sc);
	}

	// 处理传过来的SOAP消息,并返回一个SOAP消息
	public SOAPMessage onMessage(SOAPMessage msg) {
		SOAPMessage resp = null;
		try {
			System.out.println("传入的消息:");
			msg.writeTo(new FileOutputStream(new File("../webapps/soapmessage.xml")));
			SOAPBody ycBody = msg.getSOAPBody();
			Node ycResp = ycBody.getFirstChild();
			System.out.println("returnValue:"+ycResp.getTextContent());

			// 创建一个返回消息
			resp = mf.createMessage();
			SOAPEnvelope se = resp.getSOAPPart().getEnvelope();
			se.getBody().addChildElement(se.createName("ResponseMessage")).addTextNode("Received Message,Thanks");

			return resp;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return resp;
	}

}

  配置web.xml

	<servlet>
		<servlet-name>StudentInfoServlet</servlet-name>
		<servlet-class>server.ServerAction</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>StudentInfoServlet</servlet-name>
		<url-pattern>/StudentInfoServlet</url-pattern>
	</servlet-mapping>

  

原文地址:https://www.cnblogs.com/tongxinyuan/p/4552550.html