免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1056 | 回复: 0
打印 上一主题 下一主题

Axis Web Service开发指南1(转载) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-03 15:05 |只看该作者 |倒序浏览

1.1调用Axis上的Web服务

注意:程序源代码 请查看官方网站!


1.1.1一个简单的例子
执行一下命令部署服务:
启动服务器,默认端口8080。部署服务后需要重新启动服务器。
% java org.apache.axis.client.AdminClient  samples/example1/deploy.wsdd
%cp samples  /axis/WEB-INF/classes/
首先让我们来看一个简单的webservice客户程序,它将调用Axis服务器上的一个echoString方法
1   import org.apache.axis.client.Call;
2   import org.apache.axis.client.Service;
3   import javax.xml.namespace.QName;
4
5   public class TestClient {
6      public static void main(String [] args) {
7         try {
8           String endpoint =
9           " http://localhost:8080/axis/services/TestServer";
10
11           Service  service = new Service();
12           Call  call  = (Call) service.createCall();
13
14           call.setTargetEndpointAddress(new java.net.URL(endpoint) );
15           call.setOperationName(new QName("http://soapinterop.org/", echoString"));
16
17           String ret = (String) call.invoke( new Object[] { "Hello!" } );
18
19           System.out.println("Sent 'Hello!', got '" + ret + "'";
20        } catch (Exception e) {
21        System.err.println(e.toString());
22     }
23    }
24  }
你可以执行一下命令运行该程序
%javac samples.example1.TestClient.java
%java samples.example1.TestClient
Sent 'Hello!', got 'Hello!'
%
程序是如何调用服务运行的呢?在11和12行我们创建了一个Service和Call对象,它们都是用来存放关于服务调用数据的标准JAX-RPC对象。在14行我们提供了终端URL——它指定了我们SOAP信息的目的地。在15行我们指定了调用的webservice的方法.,并且在17行我们调用了我们期望的服务.,同时传递一个数组参数——这里只是一个String。

你可以通过查看发送的SOAP请求来了解怎么传递这个参数。
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
   
      Hello!
   
  
这里的String参数自动的被格式化为XML,服务端返回同样的String。就像我们上面看到的一样。
1.1.2为参数命名
在上面的例子中,Axis自动的把XML格式的参数在SOAP消息中直接命名为“arg0”,“agr1”,如果你想改变这一点,很容易,在你调用invoke()之前你需要对每一个参数调用addParameter和setReturn,例如:
call.addParameter("testParam",org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
这样的话将把testParam分配给调用方法的第一参数,也同时定义了参数的类型,以及说明了是输入、输出或者是输入输出参数,这里是一个输入参数。运行程序你将得到如下消息:
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
   
      Hello!
   
  
这的参数名称就是我们期望的testParam了。

1.1.3与”无类型”Server的互操作
在上面的例子中,我们已经映射了invoke()的返回类型到一个Object,我们知道echoString方法返回一个String,所以我们希望从client.invoke()这里返回一个String。现在让我们看一下这是怎么发生的。下面是一个典型的echoString方法的响应:
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
     
      type="xsd:string">Hello!
     
  
请看我们加粗的部分——这个属性是一个schema 类型声明,Axis用它来指出那个元素内容是什么类型,这里将把它反串行化为一个JAVA String对象。但是在其他情况下会返回如下响应:
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
   
      Hello, I'm a string!
   
  
消息中没有指定类型,我们是否知道元素的反串行化结果是个什么java 对象?答案就是原数据——数据的数据。在这种情况下我们就需要指定我们期望的返回类型。下面说明了Axis的客户端程序该怎么做。
   call.setReturnType( org.apache.axis.Constants.XSD_STRING );
这个方法将告诉Axis客户程序,如果返回的元素没有定义类型,那么它将等同于在SOAP中使用type属性做如下定义xsi:type="xsd:string"。
   这里有个同样功能的方法,它允许你指定期望返回类型的Java类。
call.setReturnClass(String.class);
现在我们已经了解了一个客户程序访问一个SOAP服务的基本知识。下面我们将说明如何发布自己的服务。

1.2使用Axis发布服务
假如我们有一个象下面一样的简单类:
public class Calculator {
  public int add(int i1, int i2) {
    return i1 + i2;
  }
  public int subtract(int i1, int i2) {
    return i1 - i2;
  }
}
我们怎样才能使它通过SOAP访问呢?这里将有几种答案,但是我们将从Axis提供的最简单的方法开始,实现它可以说毫不费力。

1.2.1Jws文件——即时部署
第一步:复制上面的类到webapps目录,并重命名为Calcalator.jws。你将使用下面命令:
%copy  Calculator.java  /axis/Calculator.jws
第二步:你已经完成了部署。你可以通过下面的连接来访问服务:
http://localhost:8080/axis/Calculator.jws
(这里假定你Axis服务端口8080)

Axis将自动定位该文件,编译该文件,并且正确的转换SOAP调用到你的服务程序。
我们可以运行calculator客户端程序来测试结果:
% java samples.example2.CalcClient -p8080 add 2 5
Got result : 7
% java samples.example2.CalcClient -p8080 subtract 10 9
Got result : 1
%
注意:jws服务主要被简单服务使用,你不能使用包,你不能发现错误直到你服务部署之后,因为代码只有在运行的时候才去编译。

1.2.2自定义部署——wsdd
    Jws文件可以很快的把你的java类部署成web service,但是不是最好的选择。因为,你需要源代码——但是很多时候你可能想部署一个已经存在的没有源代码class文件。你可以做的配置比较有限,比如怎样访问一个服务是受限制的——你不能定义自定义类型的映射,或者不能控制调用那一个Handlers当用户调用服务时。
通过描述符文件来部署服务
为了更灵活的使用Axis,你应该熟悉Axis 的Web Service Deployment Descriptor(WSDD)文件格式。下面我们来看一个基本服务的部署描述符。
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  
   
   
  
非常简单,最外层元素告诉引擎这是一个WSDD部署文件,并且定义了java的名字空间,接下来的service元素定义了我们的服务。一个服务就是一个targeted chain,意味着它将有下面的一个或多个:一个请求流,一个Handler,一个响应流。这里我们的provider是Axis内置的java:RPC ,这说明这是一个Java RPC服务。为了让RPCProvider能够调用正确的方法,我们使用标签,一个参数定义服务的类名,另一个参数告诉引擎这个类的任何public方法都可以通过SOAP调用。

使用AdminClient
一旦我们有了wsdd文件,我们需要把它送给Axis服务器来具体的部署描述的服务,我们通过AdminClient,或者"org.apache.axis.client.AdminClient"来实现这一点,如果你的Axis不是部署在Tomcat中,你可能需要使用-p  参数。默认端口是8080,AdminClient工具的一个典型调用如下:
% java org.apache.axis.client.AdminClient deploy.wsdd
Done processing
这个命令将使我们的服务可以通过SOAP来进行访问。可以通过运行客户程序来验证这一点:
% java samples.example3.MyClient -lhttp://localhost:8080/axis/services/MyService
"test me!"
You typed : test me!
%
你也可以使用下面命令来列出服务器上部署的所有的服务:
% java org.apache.axis.client.AdminClient list

更多的部署
现在让我们来了解Axis引擎更强大的特性,假设你想知道你的服务被调用了多少次,我们在sample/log下有一个简单的handler来实现这一点。要使用这个handler类,你需要首先部署它,然后你使用你给他指定的名字来部署服务,下面是一个简单的部署文件:
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  
  
   
   

  
  
   
      
   

   
   
  

第一部分定义了一个称作track的Handler,它是由LogHandler类实现的,我们同时使用了参数指定了写入log的文件。
这样我们就定义了一个web服务,LogTestService,它和我们看到的RPC服务是一样的。不同的地方是在元素内我们包含了元素——这意味着当你调用这个服务时需要执行一些Handlers。通过引入一个track,我们保证了每次调用服务都会写如日志。


原文地址
http://ws.apache.org/axis/java/user-guide.html#ConsumingWebServicesWithAxis


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/36006/showart_394260.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP