zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    SpringBoot入门
    Maven相关
    IO流之RandomAccessFile和File
    javaSE之运行时异常和编译时异常
    Map.Entry的由来和使用
    Oracle常用基础语法(未完待补和操作)
    Oracle存储过程和存储函数
    论文阅读笔记(三十七)【AAAI2020】:Frame-Guided Region-Aligned Representation for Video Person Re-identification
    论文阅读笔记(三十六)【AAAI2020】:Relation-Guided Spatial Attention and Temporal Refinement for Video-based Person Re-Identification
    论文阅读笔记(三十五)【CVPR2019】:Perceive Where to Focus: Learning Visibility-aware Part-level Features for Partial Person Re-identification
  • 原文地址:https://www.cnblogs.com/tongxinyuan/p/4552550.html
Copyright © 2011-2022 走看看