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