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());  
           }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM