加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webService接口调用

发布时间:2020-12-17 00:19:12 所属栏目:安全 来源:网络整理
导读:搞webservice搞了一段时间,但总感觉还有些东西没搞懂,记录一些心得以备后续之需: 一、服务端开发(Xifire) 1、没有wsdl直接开发服务端(MyEclipse)。 a、在MyEclipse中新建Web Services Project(选择Xfire) b、新建服务类(例如:com.unicom.ucloud.H

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读