`
huttoncs
  • 浏览: 200914 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Axis客户端的几种实现方式

 
阅读更多
通过命令行实现,实在是太长了,于是按照网上的方式写在了bat文件中

set Axis_Lib=.\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=.\source
set Package= com.test.webservice.client
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% -uri currencyConvert.wsdl


以上就是bat文件的具体内容,命令的简单介绍

从最简单的开始 ,-uri 指定wsdl文件
> WSDL2Java -uri currencyConvert.wsdl

-d 使用不同的data binding方法
> WSDL2Java -uri currencyConvert.wsdl -d xmlbeans

-a 生成异步的方法
> WSDL2Java -uri currencyConvert.wsdl -a

-t 生成测试case
> WSDL2Java -uri currencyConvert.wsdl -t

稍微复杂一些的,-p可以指定生成的package,-o指定生成的路径,-ss生成服务端代码


客户端例子
package test;

import wsclient.myservices.*;

import java.net.URL;
import java.util.*;
import javax.xml.namespace.QName;
import org.apache.axis.client.*;

import org.apache.wsif.*;
import org.apache.wsif.wsdl.AuthenticatingProxyWSDLLocatorImpl;

/**
* axis1.x客户端调用测试
* @author peidw
*
*/
public class MyServiceExe {
    /**
     * 使用axis的WSDL2JAVA调用WS服务,如果服务器端添加了简单handler用户验证,则需要修改
     * ..SoapBindingStub类的createCall()方法,
     * @throws Exception
     */
    public static  void handlerCallDemo()throws Exception{
        MyServicesService ms=new MyServicesServiceLocator();
        MyServices_PortType msp=ms.getMyServices();
        Book book=msp.getBookByIsbn("125-6922-10");
        System.out.println(book.getAuthor()+"-"+book.getBookname()+"-"+book.getIsbn());
        Map map=msp.getAllBookMap();
        Set keyset=map.keySet();
        Iterator it=keyset.iterator();
        String tmp=null;
        while(it.hasNext()){
            tmp=(String)it.next();
            System.out.println(tmp);
        }
    }
    /**
     * 通过动态接口方式调用,使用axis提供的client包
     * 最简单的使用方式
     * @throws Exception
     */
    public static void dynamicCall()throws Exception{
        String endpoint_1="http://localhost:8000/axis/services/Version?wsdl";
        Service service = new Service();
        Call call=(Call)service.createCall();
        call.setOperationName(new QName(endpoint_1,"getVersion "));
        call.setTargetEndpointAddress(new URL(endpoint_1));
        String result=(String)call.invoke(new Object[]{});
        System.out.println("result="+result);
    }
    /**
     * 使用WSIF来调用axis发布的服务
     * <pre>
     * WSIF具有可对任何 Web 服务进行独立于绑定的访问的 API。
     * 它紧密依赖于 WSDL,因此可以调用可在 WSDL 中描述的任何服务。
     * </pre>
     * @throws Exception
     */
    public static void wsifCall()throws Exception {
        String url="http://localhost:8000/axis/services/Version?wsdl";
        WSIFServiceFactory factory=WSIFServiceFactory.newInstance();
        //如果调用的方法需要进行用户/密码校验,需执行下面代码
        //AuthenticatingProxyWSDLLocatorImpl awsli=new AuthenticatingProxyWSDLLocatorImpl(url,"gaolong1","19831001"); //验证连接
        WSIFService service=factory.getService(url,"http://localhost:8000/axis/services/Version","VersionService","http://localhost:8000/axis/services/Version","Version");
        WSIFPort port = service.getPort();
        WSIFOperation operation = port.createOperation("getVersion","getVersionRequest",null);//根据给定的操作名称参数operationName,输入元素名称inputName,输出元素名称
        WSIFMessage input = operation.createOutputMessage();//设置输入参数
        WSIFMessage output = operation.createOutputMessage();//设置输出参数
        WSIFMessage fault = operation.createFaultMessage(); //异常信息
        operation.executeRequestResponseOperation(input,output,fault); //执行请求
       
        System.out.println(output.getObjectPart("getVersionReturn"));
       
    }
    public static void main(String[] args)throws Exception{
        handlerCallDemo();
        dynamicCall();
        wsifCall();
    }
}

通常说Axis支持三种web  service的部署和开发,分别为: 

1、Dynamic  Invocation  Interface  (  DII) 

2、Stubs方式 

3、Dynamic  Proxy方式 

上面的例子中方法一应该属于Stubs方式  ,方法二、三属于Dynamic  Invocation  Interface  (  DII) 。

至于第三种模式在网上找到了这段代码
2、编写代理接口   


public  interface  HelloClientInterface 
extends  java.rmi.Remote 

       public  String  getName(String  name) 
           throws  java.rmi.RemoteException; 

  



3、编写并执行客户端程序TestHelloClient.java   


import  javax.xml.rpc.Service; 
import  javax.xml.rpc.ServiceFactory; 
import  java.net.URL; 
import  javax.xml.namespace.QName; 

public  class  TestHelloClient   

       public  static  void  main(String[]  args) 
           { 
               try 
               { 
                       String  wsdlUrl  =   
                                   "http://localhost:8080/Axis/HelloClient.jws?wsdl"; 
                       String  nameSpaceUri  =   
                                   "http://localhost:8080/Axis/HelloClient.jws"; 
                       String  serviceName  =  "HelloClientService"; 
                       String  portName  =  "HelloClient"; 

                       ServiceFactory  serviceFactory  =   
                                   ServiceFactory.newInstance(); 
                       Service  afService  = 
                                   serviceFactory.createService(new  URL(wsdlUrl), 
                 new  QName(nameSpaceUri,  serviceName)); 
                       HelloClientInterface  proxy  =  (HelloClientInterface) 
               afService.getPort(new  QName( 
                                       nameSpaceUri,  portName),   
                                                           HelloClientInterface.class); 
                       System.out.println 
                                   ("return  value  is  "+proxy.getName("john")  )  ; 
               }catch(Exception  ex) 
               { 
                       ex.printStackTrace()  ; 
               } 
       } 

个人觉得和DII方式没大区别,所以未做尝试,先mark一下。


对于第三方法中基于WSDL的客户端实现方式,由于我没有找到wsif的jar包,很遗憾没能尝试一下。不过刚好在公司用到过另外一种方法,那就是WSDL4j.jar包里的方法也可以Axis的客户端,貌似只支持String类型的请求参数,个人觉得不是很好用,不知道当前架构师为什么这么用。下面是具体实例

import org.apache.axis.Constants;
import org.apache.axis.encoding.ser.SimpleDeserializer;
import org.apache.axis.wsdl.gen.Parser;
import org.apache.axis.wsdl.symbolTable.*;

import javax.wsdl.*;
//import javax.wsdl.extensions.soap.SOAPAddress;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.encoding.Deserializer;
import javax.xml.rpc.encoding.DeserializerFactory;

import java.util.*;

//import localhost.axis.services;
// Web Service Dynamic Invoker

public class DynamicInvoker
{
private Parser wsdlParser = null;
private Map services = null;

public DynamicInvoker(String wsdlURL) throws Exception
{
  wsdlParser = new Parser();
  wsdlParser.run(wsdlURL);
  services = enumSymTabEntry(ServiceEntry.class);
}

public Map invoke(String serviceName,
       String portName,
       String operationName,
       Vector parameterValues) throws Exception
{
  Vector inputs = new Vector();
  String returnName = null;

  ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  Service service = serviceEntry.getService();
  org.apache.axis.client.Service clientService = new
    org.apache.axis.client.Service(wsdlParser, service.getQName());

  Call call = clientService.createCall(QName.valueOf(portName), QName.valueOf(operationName));
  ((org.apache.axis.client.Call) call).setTimeout(new Integer(15 * 1000));

  BindingEntry bindingEntry = getBindingEntry(serviceName, portName);
  Operation o = getOperation(bindingEntry, operationName);
  Parameters parameters = bindingEntry.getParameters(o);

  if (parameters.returnParam != null)
  {
   //QName returnType = org.apache.axis.wsdl.toJava.Utils.getXSIType(parameters.returnParam);
   QName returnQName = parameters.returnParam.getQName();
   returnName = returnQName.getLocalPart();
  }

  int size = parameters.list.size();
  for (int i = 0; i < size; i++)
  {
   Parameter p = (Parameter) parameters.list.get(i);
   switch (p.getMode())
   {
    case Parameter.IN :
     inputs.add(getParamData((org.apache.axis.client.Call) call
           , p
           , (String) parameterValues.elementAt(i)));
     break;
    case Parameter.OUT :
     break;
    case Parameter.INOUT :
     inputs.add(getParamData((org.apache.axis.client.Call) call,
           p,
           (String) parameterValues.elementAt(i)));
     break;
   }
  }

  Object ret = call.invoke(inputs.toArray());
  Map outputs = call.getOutputParams();
  HashMap map = new HashMap();
  if (ret != null && returnName != null)
  {
   map.put(returnName, ret);
  }
  if (outputs != null)
  {
   for (Iterator i = outputs.keySet().iterator(); i.hasNext();)
   {
    Object obj = i.next();
    String name;
    Object value;
    if (obj.getClass().getName().equals("java.lang.String"))
    {
     name = (String) obj;
    }
    else
    {
     name = ((QName) obj).getLocalPart();
    }
    value = outputs.get(obj);
    map.put(name, value);
   }
  }
  return map;
}

public Vector enumServiceNames()
{
  Vector v = new Vector();
  Iterator i = services.keySet().iterator();
  while (i.hasNext())
  {
   String s = (String) i.next();
   v.addElement(s);
  }
  return v;
}

public Vector enumPortNames(String serviceName)
{
  Vector v = new Vector();
  ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  Map ports = serviceEntry.getService().getPorts();
  Iterator i = ports.keySet().iterator();
  while (i.hasNext())
  {
   String s = (String) i.next();
   v.addElement(s);
  }
  return v;
}

public Vector enumOperationNames(String serviceName, String portName)
{
  Vector v = new Vector();
  BindingEntry entry = getBindingEntry(serviceName, portName);
  Set operations = entry.getOperations();
  Iterator i = operations.iterator();
  while (i.hasNext())
  {
   Operation o = (Operation) i.next();
   String s = o.getName();
   v.addElement(s);
  }
  return v;
}

public Parameters enumParameters(String serviceName
         , String portName
         , String operationName)
{
  BindingEntry entry = getBindingEntry(serviceName, portName);
  Operation o = getOperation(entry, operationName);
  Parameters parameters = entry.getParameters(o);
  return parameters;
}

public String getParameterModeString(Parameter p)
{
  String ret = null;
  switch (p.getMode())
  {
   case Parameter.IN:
    ret = "[IN]";
    break;
   case Parameter.INOUT:
    ret = "[IN, OUT]";
    break;
   case Parameter.OUT:
    ret = "[OUT]";
    break;
  }
  return ret;
}

private BindingEntry getBindingEntry(String serviceName, String portName)
{
  ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
  Port port = serviceEntry.getService().getPort(portName);
  Binding binding = port.getBinding();
  SymbolTable table = wsdlParser.getSymbolTable();
  return table.getBindingEntry(binding.getQName());
}

private Operation getOperation(BindingEntry entry, String operationName)
{
  Set operations = entry.getOperations();
  Iterator i = operations.iterator();
  while (i.hasNext())
  {
   Operation o = (Operation) i.next();
   if (operationName.equals(o.getName()))
   {
    return o;
   }
  }
  return null;
}

// return Map of <QName.getLocalPart, SymTabEntry>
private Map enumSymTabEntry(Class cls)
{
  HashMap ret = new HashMap();
  HashMap map = wsdlParser.getSymbolTable().getHashMap();
  Iterator iterator = map.entrySet().iterator();
  while (iterator.hasNext())
  {
   Map.Entry entry = (Map.Entry) iterator.next();
   QName key = (QName) entry.getKey();
   Vector v = (Vector) entry.getValue();
   int size = v.size();
   for (int i = 0; i < size; ++i)
   {
    SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i);
    if (cls.isInstance(symTabEntry))
    {
     ret.put(key.getLocalPart(), symTabEntry);
    }
   }
  }
  return ret;
}

private Object getParamData(org.apache.axis.client.Call c, Parameter p,
        String arg) throws Exception
{
  // Get the QName representing the parameter type
  QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p);

  TypeEntry type = p.getType();
  if (type instanceof BaseType && ((BaseType) type).isBaseType())
  {
   DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType);
   Deserializer deserializer = factory.getDeserializerAs(Constants.
                  AXIS_SAX);
   if (deserializer instanceof SimpleDeserializer)
   {
    return ((SimpleDeserializer) deserializer).makeValue(arg);
   }
  }
  throw new RuntimeException("not know how to convert '" + arg
           + "' into " + c);
}
}

class AppTest
{
public static void main(String[] args) throws Exception
{
  System.out.println("Hello World!");
  //动态调用 WebServics
  String location = "http://localhost:1080/axis/services/Class1Service?wsdl";
  DynamicInvoker invoker = new DynamicInvoker(location);
  Vector vServices = invoker.enumServiceNames();
  Object[] Services = vServices.toArray();
  Arrays.sort(Services);
  for (int i = 0; i < Services.length; i++)
  {
   String serviceName = (String) Services[i];
   System.out.println(serviceName);
   Vector V = invoker.enumPortNames(serviceName);
   String portName = (String) V.elementAt(0);
   V = invoker.enumOperationNames(serviceName, portName);
   Object[] OperationNames = V.toArray();
   Arrays.sort(OperationNames);
   for (int j = 0; j < OperationNames.length; j++)
   {
    String operationName = (String) OperationNames[j];
    System.out.println("\t" + (String) OperationNames[j]);
    Parameters parameters = invoker.enumParameters(serviceName, portName, operationName);
    Vector v = parameters.list;
    Vector parameterValues = new Vector();
    for (int k = 0; k < v.size(); k++)
    {
     Parameter para = (Parameter) v.elementAt(k);
     System.out.print("\t\t" + para.getQName().getLocalPart());
     if (para.getType().getQName().getLocalPart().equals("string"))
     {
      parameterValues.addElement("asdasdas");
     }
     else
     {
      parameterValues.addElement(null);
     }
     System.out.print("\t" + para.getType().getQName().getLocalPart());
     System.out.println("\t" + invoker.getParameterModeString(para));
    }
    Map result = invoker.invoke(serviceName, portName, operationName, parameterValues);
    for (Iterator it = result.keySet().iterator(); it.hasNext();)
    {
     String name = (String) it.next();
     Object value = result.get(name);
     String line;
     if (value != null)
     {
      line = name + "=" + result.get(name).toString() + "\n";
     }
     else
     {
      line = name + "=(null)\n";
     }
     System.out.println(line);
    }
   }
  }
分享到:
评论

相关推荐

    基于axis2实现的webservice简单实现(客户端+服务端)。

    【标题】中的“基于axis2实现的webservice简单实现(客户端+服务端)”表明了本文将探讨如何使用Apache Axis2框架来创建和消费Web服务。Apache Axis2是Apache软件基金会开发的一个Web服务引擎,它提供了高效且灵活的...

    axis2生成客户端服务端代码

    Axis2是Apache组织下的一个开源项目,它是一种高性能、轻量级的Web服务框架,支持SOAP和REST等协议,能够帮助开发者轻松地构建和部署Web服务。Axis2提供了一套完整的工具链,包括用于生成客户端和服务端代码的工具,...

    axis2客户端调用webService接口,精简jar包

    总的来说,使用Axis2客户端调用WebService接口是一种常见的开发实践,通过精简jar包可以优化项目的体积,提高部署效率。理解这个过程并掌握如何精简jar包,对于任何涉及到Web服务的开发工作都是十分有益的。

    axis服务端和客户端创建

    本文详细介绍了如何构建Apache Axis 1.4的服务端和客户端,包括必要的准备工作、项目创建和配置、服务接口的实现以及客户端的创建。通过遵循这些步骤,可以有效地搭建起一个基于SOAP的Web服务系统,从而实现跨平台的...

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    CXF、AXIS2、XFire是三种流行的Java Web服务框架,它们允许开发者创建和消费Web服务。在本文中,我们将重点关注CXF客户端调用Web服务的方法,特别是处理Map类型参数的问题。 首先,CXF客户端调用Web服务时,通常会...

    axi2客户端调用的几种方式

    本文将深入探讨AXIS2客户端调用的几种常见方式,以帮助开发者更好地理解和应用这一强大的工具。 首先,我们要理解AXIS2的核心概念。AXIS2是一个Java Web服务实现库,它提供了服务的全生命周期管理,包括服务的创建...

    axis2方式开发webservice

    myeclipse安装axis2.txt文件:详细说明了myeclipse如何安装axis2插件,以及编写简单的服务端代码,以及axis2客户端访问服务端的几种方式。 axisdemo是一个普通的javaweb工程,里面有一个简单的接口,在此工程的基础...

    axis生成客户端两种简单方法(附加mail.jar,activation.jar,xalan.jar,xmlsec.jar)

    本篇文章将深入探讨如何使用AXIS生成客户端代码,同时介绍与之相关的几个重要库文件:mail.jar, activation.jar, xalan.jar以及xmlsec.jar。 首先,让我们了解一下AXIS生成客户端的两种基本方法: 1. **WSDL2Java...

    AXIS开发的基于JAVA的webservice及客户端

    在本篇博文中,我们将深入探讨AXIS如何帮助开发者在Java环境中实现Web服务的开发。 首先,Web服务是一种通过互联网进行通信的应用程序接口(API)。它们允许不同的系统之间交换数据,不受平台或编程语言的限制。...

    在自己的项目中利用axis2+spring发布webservice与客户端调用包括session

    在axis2+spring的环境下,可以通过两种方式处理session: - **SOAP Header**:可以将session信息封装在SOAP消息的Header部分,每次请求时携带。 - **Cookie**:客户端和服务端可以通过Cookie来维护会话状态,但...

    cxf_axis_xfire客户端调用的几种方法.docx

    本文将详细介绍使用CXF作为客户端调用Web服务的几种方法,并结合示例解释相关知识点。 1. **CXF客户端调用** CXF是一个开源的Java框架,它支持多种Web服务标准,包括JAX-WS和JAX-RS。对于客户端调用,CXF提供了一...

    基于Axis2的WS构建客户端示例

    在压缩包"Axis2客户端测试"中,可能包含了一个完整的示例客户端项目,你可以参考其中的代码结构和调用方式。 通过这个过程,你不仅可以掌握如何使用Apache Axis2创建Web服务客户端,还能了解到Web服务的基本概念和...

    Axis2.jar包

    在描述中提到的“之前公司用了webservice搞了好就 写了好几种”,这可能意味着使用Axis2来实现不同类型的Web服务接口,或者在不同的项目中进行了多次的Web服务开发。 **标签:** 1. **Java** - Axis2是基于Java...

    axis2开发webservice(二)

    myeclipse安装axis2.txt文件:详细说明了myeclipse如何安装axis2插件,以及编写简单的服务端代码,以及axis2客户端访问服务端的几种方式。 axisdemo是一个普通的javaweb工程,里面有一个简单的接口,在此工程的基础...

    AXIS2+Myeclipse实现WebService数据库存储简单实例

    AXIS2提供了一种直观的方式来创建和部署Web服务。服务器端代码可能包括了服务接口定义(如使用JAX-WS规范的@WebService注解),以及其实现类,这些类包含了业务逻辑,比如验证用户输入的登录信息,查询数据库,然后...

    AXIS2实现WebService的jar包

    客户端可以通过多种方式调用AXIS2发布的Web服务: - 使用AXIS2的客户端API,如Stub类,直接编程调用。 - 通过SOAP消息直接发送请求,可以使用各种HTTP客户端库,如Apache HttpClient。 - 利用AXIS2生成的客户端...

    WebService调用的几种方式

    本文将深入探讨在Java环境中调用WebService的五种主要方式:Axis、CXF、HttpClient、MyEclipse反向生成以及XFire。 1. Axis:Apache Axis是最早且广泛使用的SOAP库,用于创建和消费Web服务。使用Axis调用WebService...

    webservice四种发布方式及客户端调用

    本文将详细介绍四种常见的 WebService 发布方式及其客户端调用方法,包括 CXF、XFire、AXIS1 和 AXIS2,并结合实际案例进行分析。 #### 二、CXF 方式 **1. 概述** - CXF 是 Apache 的一款开源框架,它提供了强大...

    axis2实现webservice请求

    在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。当我们谈论 Axis2 时,我们指的是一个高效、灵活且强大的Web服务框架,它是Apache软件基金会开发的。Axis2 是用于构建和部署Web...

Global site tag (gtag.js) - Google Analytics