技术开发 频道

用Axis开发基于Java的Web服务

  【IT168 技术文档】服务的访问

  GET方式的服务访问

  一般的SOAP消息都是采用POST方式实现传递,但也可以通过GET方式来访问。比如以下给出的一个服务——“HelloWorld”,其源码如下:

  文件HelloWorld.jws

  /**   * @author 飞鹰   */   public class HelloWorld   {   public String helloWorld()   {   //在服务器端打印输出   System.out.println( "Hello World!" );   //返回相应字符串   return "Hello World!";   }//helloWorld()   }/* HelloWorld */

  这个服务给出一个名位“helloWorld”的无入口参数的操作,返回一个内容为“Hello World!的字符串”,同时在服务器端打印“Hello World!”,将该文件放到“……\webapps\axis”目录下,即可通过GET方法直接访问该服务,访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同时服务器端给出了相应的显示信息“Hello World!”这表明HelloWorld服务被成功访问了。

  客户端服务访问编程

  Axis提供了一套API来实现SOAP,从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。

  其中,org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类,一般的客户端程序欲访问一个Web Service时,都要生成一个客户端的Service对象和Call对象,在访问服务之前,首先要对Call对象设置相应的参数,包括服务的位置、操作名、入口参数、返回值类型等,最后调用Call对象的invoke方法访问服务。

  以下给出了一个客户端访问Web服务的例程——AXISTest.java:

  文件AXISTest.java

  package axisexercise;   import org.apache.axis.client.Call;   import org.apache.axis.client.Service;   import org.apache.axis.encoding.XMLType;   import javax.xml.rpc.ParameterMode;   /**   * @author 飞鹰   */   public class AXISTest   {   public static void main( String[] args ) throws Exception   {   Service service = new Service();   Call call = ( Call ) service.createCall();   //////////访问即时发布的Distance服务   //设置访问点   call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );   //设置操作名   call.setOperationName( "convertMile2Kilometre" );   //设置入口参数   call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );   call.setReturnType( XMLType.XSD_DOUBLE );   Double d1 = new Double( 190 );   //调用服务   System.out.println( d1 + " 英里相当于 " +   call.invoke( new Object[] {d1} ) + " 公里!" );   //////////访问定制发布的Capacity服务   call = ( Call ) service.createCall();   //设置访问点   call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );   //设置操作名   call.setOperationName( "convertGallon2Litre" );   //设置入口参数   call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );   call.setReturnType( XMLType.XSD_DOUBLE );   d1 = new Double( 10.00 );   //调用服务   System.out.println( d1 + " 加仑相当于 " +   call.invoke( new Object[] {d1} ) + " 升!" );   } //main()   }/* AXISTest */

  编译运行后运行可以看到以下的结果:

  190.0英里相当于305.71公里!

  10.0加仑相当于45.46升!

  注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同,前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws,而后者的则为http://localhost:8080/axis/services/Capacity。

  总结

  Web Services是未来网络应用的发展方向,SOAP和WSDL是Web Services的核心协议,Axis给出了一个很好的SOAP实现,它使得开发Web Services应用变得轻松而有趣。

0
相关文章