搞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 xmlns="http://xfire.codehaus.org/config/1.0">
</beans>
d、修改services.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HangUpAppInfoSrv</name>
<namespace>
http://ucloud.unicom.com/
</namespace>
<serviceClass>
com.unicom.ucloud.HangUpAppInfoSrvImpl
</serviceClass>
<serviceFactory>
org.codehaus.xfire.jaxb2.JaxbServiceFactory
</serviceFactory>
<style>document</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
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();
//create a default service endpoint
@SuppressWarnings("unused")
ESB_EOM_E12_ImportCompFormUnHangInfoSrv service = client.getESB_EOM_E12_ImportCompFormUnHangInfoSrvPort();
//TODO: Add custom client code here
//
//service.yourServiceOperationHere();
System.out.println("test client completed");
System.exit(0);
d、通过wsdl生成测试服务端(参考上面写的服务端开发即可)
2、Axis开发客户端
a、通过wsdl2java.bat工具(可以通过其他方式,我只用过此工具)生成客户端代理代码(此代码服务端照样可以用)
生成的代码清单:
TransmitServiceHttpImplService.java
TransmitServiceHttpImplServiceLocator.java
TransmitServiceHttpImplServiceSoapBindingImpl.java
TransmitServiceHttpImplServiceSoapBindingStub.java
有一种方式可以生成*Proxy.java结尾的代理类,我们最后在下面b点调用的话可以直接调用此代理类即可。
b、我们可以专门开发业务逻辑类进行逻辑处理,最后调用上述生成的客户端代理类,调用方法:
TransmitServiceHttpImplServiceSoapBindingStub binding = (TransmitServiceHttpImplServiceSoapBindingStub) new TransmitServiceHttpImplServiceLocator()
.getTransmitServiceHttpImplPort();
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(), elementToMap(ele, 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, hashMap));
map.put(ele.getName(), 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();
}
}
}