- 论坛徽章:
- 0
|
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 |
|