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




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值