zoukankan      html  css  js  c++  java
  • java动态调用webservice(.asmx?wsdl)

    一 、web格式的接口动态调用代码

    这个是之前调用webservise的动态接口,用着一直OK,直到这个词对接.asmx?wsdl的接口就报错了

     /*webservice接口调用*/
        private Object[] connectWSCore(String ifUrl,String method,Document document){
            JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
            System.out.println("ifUrl===="+ifUrl);
            Client client = factory.createClient(ifUrl);
            // 需要密码的情况需要加上用户名和密码
            //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
            HTTPConduit conduit = (HTTPConduit) client.getConduit();
            HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
            httpClientPolicy.setConnectionTimeout(2000);  //连接超时
            httpClientPolicy.setAllowChunking(false);    //取消块编码
            httpClientPolicy.setReceiveTimeout(120000);     //响应超时
            conduit.setClient(httpClientPolicy);
            Object[] objects = null;
            try {
    
                String s = document.asXML();
                System.out.println("数据:--->>>" + s);
                objects = client.invoke(method, s);
                String result = objects.toString();
                System.out.println("返回数据:result---->>>" + result);
                System.out.println("返回数据:---->>>" + objects[0]);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return objects;
        }
        /**
         * 消息推送接口
         */
        public String connectWS(String url,String method,Map<String,String> param) {
    
            Document document = DocumentHelper.createDocument();
            Element root = document.addElement("request");
            param.forEach((key,val)->{
                root.addElement(key).addText(val);
            });
            try {
                Object[] objects = connectWSCore(url,method,document);
                return objects.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return  "";
        }

    一 、asmx格式的接口动态调用代码

    首页说明接口用soapui是可以测试成功的;

    调用中用了如下两段代码,期间报错如下两条:

      Q1:webserver引用出现”服务器未能识别 HTTP 头 SOAPAction 的值“

      Q2:服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。

    private Call getCall2(String url, String method){
            Call call = null;
            try {
                call = (Call) service.createCall();
                call.setTargetEndpointAddress(new java.net.URL(url));
                String soapaction = "http://tempuri.org/";
                call.setUseSOAPAction(true);
                soapaction = soapaction+ method;
                log.info("path:--->>>" + soapaction);
                call.setSOAPActionURI(soapaction);
                call.setOperationName(method);// WSDL里面描述的接口名称
    //            call.setOperationName(new QName(soapaction, method));
                call.addParameter("Msg", XMLType.XSD_STRING, ParameterMode.IN);
    //            call.setReturnType(new QName(soapaction, method),String.class);
                call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型
    //            call.addParameter("Body", XMLType.XSD_STRING, ParameterMode.OUT);
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ServiceException e1) {
                e1.printStackTrace();
            }
            return call;
        }
    /*webservice接口调用*/
        private NodeList connectWSCore(String ifUrl, String method, String param){
            JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
            System.out.println("ifUrl===="+ifUrl);
            Client client = factory.createClient(ifUrl);
            // 需要密码的情况需要加上用户名和密码
            //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
            HTTPConduit conduit = (HTTPConduit) client.getConduit();
            HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
            httpClientPolicy.setConnectionTimeout(2000);  //连接超时
            httpClientPolicy.setAllowChunking(false);    //取消块编码
            httpClientPolicy.setReceiveTimeout(120000);     //响应超时
            conduit.setClient(httpClientPolicy);
            Object[] objects = null;
            try {
    //            String res = callWebserviceASMX(ifUrl,"Msg",method,param);
    //            log.info("数据res:--->>>" + res);
    //            param = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+param;
                System.out.println("数据:--->>>" + param);
                log.info("数据:--->>>" + param);
                /*if (ifUrl.contains(".asmx")) {
                    log.info("asmx:1--->>>true");
                    QName qName = getOperateQName(client,method);
                    log.info("asmx:2--->>>true");
                    objects = client.invoke(qName, param);
                } else {
                    objects = client.invoke(method, param);
                }*/
                objects = client.invoke(method, param);
                log.info("objects======:"+objects.length);
                String result = objects.toString();
                System.out.println("返回数据:result---->>>" + result);
                System.out.println("返回数据:---->>>" + objects[0]);
    
                log.info("result======:"+result);
                org.dom4j.Document document = DocumentHelper.parseText(objects.toString());
                log.info("dom4j======:"+document);
    //            org.dom4j.Element root = document.getRootElement();
                Document doc = DocTransformUtil.parse(document);
                log.info("w3c======:"+doc);
                Element root = doc.getDocumentElement();
                return  root.getChildNodes();
            } catch (Exception e) {
                log.error(e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

    最后使用如下连接中的代码解决,代码直接粘贴他的了

    https://blog.csdn.net/pengshengli/article/details/84136309

    public static void GetStudent()
        {  
            try {
                    String url ="http://localhost:9999/WebService.asmx";
                    String namespace = "http://tempuri.org/";
                    Service service = new Service();  
                    Call call = (Call) service.createCall(); 
                    QName qname = new QName(namespace, "GetdbData"); //设置命名空间和需要调用的方法名
                    call.setOperationName(qname);
                    call.setTargetEndpointAddress(url);  
                    call.setSOAPActionURI(namespace + "GetdbData");
                    call.addParameter(new QName(namespace,"Name"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的参数  
                    call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
                    String result = (String) call.invoke(new Object[] {"Tom"});  
                    System.out.println("结果: \n" + result);  
                  } catch (Exception e) {  
                 System.err.println(e.toString());  
               }
        }
  • 相关阅读:
    【转】HEIF图片存储格式探秘
    【转】Maven项目中将配置文件打包到jar包中
    C++ 单词接龙
    vector vector int 初始化
    哈夫曼树的特点
    哈夫曼树的构造
    单链表的逆转(测试数据)
    单链表的逆转
    二叉搜索树的插入
    二叉搜索数的应用
  • 原文地址:https://www.cnblogs.com/tong2018/p/15570786.html
Copyright © 2011-2022 走看看