webService接口调用
搞webservice搞了一段时间,但总感觉还有些东西没搞懂,记录一些心得以备后续之需: 一、服务端开发(Xifire) 1、没有wsdl直接开发服务端(MyEclipse)。 a、在MyEclipse中新建Web Services Project(选择Xfire) b、新建服务类(例如:com.unicom.ucloud.HangUpAppInfoSrvImpl) c、找到工程中WebServices/services.xml,此文件为一个如下格式空文件: <?xml version="1.0" encoding="UTF-8"?> </beans> d、修改services.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> ?<service> ??</namespace> f、将此工程发布到tomcat中,即可通过http://localhost:8080/工程名/services/HangUpAppInfoSrv?wsdl 访问到发布的wsdl文件 ? 2、有wsdl文件开发服务端(MyEclipse) a、新建Web Services Project(选Xfire) b、选择此工程New--others--MyEclipse--Web Services--Web Service导入已有wsdl文件即可生成服务端代理代码 主要代码清单如下(类结尾都是一样): ESB_CSS_CSS_ImportCompFormHangUpAppInfoSrv.java ESB_CSS_CSS_ImportCompFormHangUpAppInfoSrvClient.java ESB_CSS_CSS_ImportCompFormHangUpAppInfoSrvImpl.java c、工程中WebServices/services.xml配置文件已经自动配置好。只需通过http://localhost:8080/工程名/HangUpAppInfoSrv?wsdl访问即可。 d、我们的业务逻辑代码都在*SrvImpl.java类中对应方法内进行开发。 f、可以在*SrvClient.java类中main方法进行服务端测试,也可以通过SoupUI工具或者MyEclipse自带的功能进行服务端测试。 ? 二、开发客户端(开发客户端都得有wsdl文件) 1、xFire客户端开发 a、新建Web Services Project(选Xfire) b、选择此工程New--others--MyEclipse--Web Services--Web Service Client导入已有wsdl文件即可生成客户端代理代码 主要代码清单如下(类结尾都是一样): ESB_EOM_E12_ImportCompFormUnHangInfoSrv.java ESB_EOM_E12_ImportCompFormUnHangInfoSrvClient.java c、我们可以专门开发业务逻辑类进行逻辑处理,最后调用上述生成的客户端代理类(*SrvClient.java) 在*SrvClient.java类中有一个main方法,其中有如何调用示例代码: ? ESB_EOM_E12_ImportCompFormUnHangInfoSrvClient client = new ESB_EOM_E12_ImportCompFormUnHangInfoSrvClient(); d、通过wsdl生成测试服务端(参考上面写的服务端开发即可) ? 2、Axis开发客户端 a、通过wsdl2java.bat工具(可以通过其他方式,我只用过此工具)生成客户端代理代码(此代码服务端照样可以用) 生成的代码清单: TransmitServiceHttpImplService.java TransmitServiceHttpImplServiceLocator.java TransmitServiceHttpImplServiceSoapBindingImpl.java TransmitServiceHttpImplServiceSoapBindingStub.java 有一种方式可以生成*Proxy.java结尾的代理类,我们最后在下面b点调用的话可以直接调用此代理类即可。 b、我们可以专门开发业务逻辑类进行逻辑处理,最后调用上述生成的客户端代理类,调用方法: TransmitServiceHttpImplServiceSoapBindingStub binding = (TransmitServiceHttpImplServiceSoapBindingStub) new TransmitServiceHttpImplServiceLocator() interfaceResult = binding.transmit(transmitRequest);????? //其中transmit为服务端发布的方法,transmitRequest为入参,interfaceResult为返回参数。 ? 3、客户端标准调用代码(Axis,Xfire) import java.net.URL; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.codehaus.xfire.XFire; import org.codehaus.xfire.XFireFactory; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.binding.ObjectServiceFactory; public class WebServiceClient { public static Call getCall(String url,String qName,String method) throws Exception { Call call = null; org.apache.axis.client.Service service1 = new org.apache.axis.client.Service(); call = (Call)service1.createCall(); call.setOperationName(new QName(qName,method)); call.setTargetEndpointAddress(new URL(url)); return call; } public static Object getClient(String url,String classPath) throws Exception { Class serviceClass = Class.forName(classPath); org.codehaus.xfire.service.Service serviceModel = new ObjectServiceFactory().create(serviceClass); XFire xfire = XFireFactory.newInstance().getXFire(); XFireProxyFactory factory = new XFireProxyFactory(xfire); Object client = factory.create(serviceModel,url); return client; } } ? 附上xml2map转换代码: import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class XmlToMap { public static Map xmlToMap(String xml,String encoding) throws UnsupportedEncodingException { byte[] xmlBytes = xml.getBytes(encoding); return xmlByteToMap(xmlBytes); } public static Map xmlByteToMap(byte[] xml) { Map map = new HashMap(); if (new String(xml).trim().length() != 0) { SAXBuilder builder = new SAXBuilder(); try { ByteArrayInputStream stringInputStream = new ByteArrayInputStream(xml); Document doc = builder.build(stringInputStream); Element root = doc.getRootElement(); elementToMap(root,map); } catch (JDOMException e) { e.printStackTrace(); } } return map; } private static Map elementToMap(Element element,Map map) { List children = element.getChildren(); for (Iterator i$ = children.iterator(); i$.hasNext(); ) { Object object = i$.next(); Element ele = (Element)object; if (ele.getName().equals("parameter")) { if (ele.getChildren().size() > 0) { Map hashMap = new HashMap(); if (!map.containsKey(ele.getName())) map.put(ele.getAttribute("name").getValue(),elementToMap(ele,hashMap)); } else { map.put(ele.getAttribute("name").getValue(),ele.getTextTrim()); } } else if (ele.getChildren().size() > 0) { Map hashMap = new HashMap(); if (!map.containsKey(ele.getName())) { map.put(ele.getName(),hashMap)); } else { Object value = map.get(ele.getName()); if ((value instanceof List)) { ((List)value).add(elementToMap(ele,hashMap)); map.put(ele.getName(),value); } else { List array = new ArrayList(); array.add((Map)value); array.add(elementToMap(ele,array); } } } else if (!map.containsKey(ele.getName())) { map.put(ele.getName(),ele.getTextTrim()); } else { Object value = map.get(ele.getName()); if ((value instanceof List)) { ((List)value).add(ele.getTextTrim()); map.put(ele.getName(),value); } else { List array = new ArrayList(); array.add(value); array.add(ele.getTextTrim()); map.put(ele.getName(),array); } } } return map; } public static void main(String[] a) { String resultXML = "<return><serialNo>10010</serialNo><status>null</status><dealOrga>null</dealOrga><dealStaff>null</dealStaff><dealPhoneNumber>null</dealPhoneNumber></return>"; try { xmlToMap(resultXML,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |