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());  
               }
        }
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/tong2018/p/15570786.html
Copyright © 2011-2022 走看看