客户端调用SOAP服务

package com.mapgis.cloud.object.AppCloud;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.*;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.net.URL;
import java.util.Map;
import java.util.Properties;

/**
 * Created by 鱼人二代 on 2017/2/20
 */
public class CloudDogServer {

    private String service_url = "";
    private String service_namespace = "";
    private String service_protocol = "";
    private String service_msg_protocol = "";
private static CloudDogServer _cloudDogServer = null; 

    /**
     * 初始化
     * @return
     */
    public static CloudDogServer getInstance(String service_namespace,String service_protocol,String service_url)
    {
if(_cloudDogServer == null)
{
         _cloudDogServer = new CloudDogServer(service_namespace, service_protocol, service_url);
}
return _cloudDogServer;
    }

    private CloudDogServer(String service_namespace,String service_protocol,String service_url){
        //云狗服务请求地址
        this.service_url = service_url;
        //ns参数:表示WSDL文件的命名空间名。也就是<wsdl:definitions>元素的targetNamespace属性值
        this.service_namespace = service_namespace;
        //SOAP服务协议
        this.service_protocol = service_protocol;
        //SOAP消息协议
        this.service_msg_protocol = !service_protocol.contains("12") ? SOAPConstants.SOAP_1_1_PROTOCOL : SOAPConstants.SOAP_1_2_PROTOCOL;
    }

    /**
     * 客户端请求SOAP服务
     * @return
     */
    public String ImportRegisterPrice(String class_name,String action_name,Map<String,String> parameters,String result_node_name) {
        String ret_node_value = "";

        try {
            String ns = this.service_namespace;

            //1、创建服务(Service)
            Service service = Service.create(new URL(this.service_url), new QName(ns, class_name));

            //2、创建Dispatch
            Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns, this.service_protocol), SOAPMessage.class, Service.Mode.MESSAGE);

            //3、创建SOAPMessage
            SOAPMessage msg = MessageFactory.newInstance(this.service_msg_protocol).createMessage();
            SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
            SOAPBody body = envelope.getBody();

            //4、创建QName来指定消息中传递数据
            QName ename = new QName(ns, action_name, "axis");//<nn:add xmlns="xx"/>
            SOAPBodyElement ele = body.addBodyElement(ename);
            //传递参数
            int len = parameters.size();
            if (len > 0) {
                for (String obj : parameters.keySet()) {
                    ele.addChildElement(obj, "axis").setValue(parameters.get(obj));
                }
            }

            //5、通过Dispatch传递消息,会返回响应消息
            SOAPMessage response = dispatch.invoke(msg);

            //6、响应消息处理,将响应的消息转换为dom对象
            try {
                Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
                ret_node_value = doc.getElementsByTagName(result_node_name).item(0).getTextContent();
            } catch (Exception e) {
                ret_node_value = GetSOAPMessageXml(response, result_node_name);
            }
        } catch (Exception e) {
        }

        return ret_node_value;
    }

    /**
     * 将SOAPMessage数据流写入System.out,再获取SOAPMessage信息
     * @param response
     * @return
     */
    private String GetSOAPMessageXml(SOAPMessage response,String result_node_name) {
        String xmlStr = "";
        try {
            ByteArrayOutputStream baoStream = new ByteArrayOutputStream(1024);
            PrintStream cacheStream = new PrintStream(baoStream);
            PrintStream oldStream = System.out;
            System.setOut(cacheStream);

            response.writeTo(System.out);
            System.out.println();
            xmlStr = baoStream.toString();
            System.setOut(oldStream);

            if(!xmlStr.isEmpty())
            {
                StringReader sr = new StringReader(xmlStr);
                InputSource is = new InputSource(sr);
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder=factory.newDocumentBuilder();
                Document doc = builder.parse(is);

                xmlStr = doc.getElementsByTagName(result_node_name).item(0).getTextContent();
            }
        } catch (Exception e) {
        }

        return xmlStr;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值