XFire构建web service客户端的五种方式

这里并未涉及到JSR 181 Annotations 的相关应用,具体的三种方式如下

① 通过WSDL地址来创建动态客户端
② 通过服务端提供的接口来创建客户端
③ 使用Ant通过WSDL文件来生成客户端

第一种方式:通过WSDL地址来创建动态客户端

package com.jadyer.client;
import java.net.MalformedURLException;
import java.net.URL;
import org.codehaus.xfire.client.Client;
/**
 * 通过WSDL来创建动态客户端
 * @see 此时需要在项目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries
 */
public class ClientFromWSDL {
 public static void main(String[] args) throws MalformedURLException, Exception {
 Client client = new Client(new URL("http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl"));
 Object[] results11 = client.invoke("sayHello", new Object[]{"Jadyer22"});
 System.out.println(results11[0]);
 }
} 

第二种方式:通过服务端提供的端口来创建客户端

package com.jadyer.client;
import java.net.MalformedURLException;
import java.util.List;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.jadyer.model.Person;
import com.jadyer.model.User;
import com.jadyer.server.HelloService;
/**
 * 通过Web服务端提供的接口来创建客户端
 * @see 客户端必须提供一个与服务端完全一致的接口,包名也要一致
 * @see 在本例中,需要在客户端(即该项目)中提供HelloService.java接口,以及Person和User两个POJO类
 * @see 并且此时需要在项目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries
 */
public class ClientFromInterface {
 public static void main(String[] args)throws MalformedURLException{
 //首先使用XFire的ObjectServiceFactory从HelloService接口创建一个服务模型serviceModel
 //serviceModel包含服务的说明,换句话说,就是服务的元数据
 //Create a metadata of the service
 Service serviceModel = new ObjectServiceFactory().create(HelloService.class);
 //访问的地址
 String serviceURL = "http://127.0.0.1:8080/XFire_demo/services/XFireServer";
 //通过查看org.codehaus.xfire.client.XFireProxyFactory源码发现
 //下面两行代码与这里直接new XFireProxyFactory()的作用是等效的
 //XFire xfire = XFireFactory.newInstance().getXFire();
 //XFireProxyFactory factory = new XFireProxyFactory(xfire);
 //为XFire获得一个代理工厂对象
 //Create a proxy for the deployed service
 XFireProxyFactory factory = new XFireProxyFactory();
 //通过proxyFactory,使用服务模型serviceModel和服务端点URL(用来获得WSDL)
 //得到一个服务的本地代理,这个代理就是实际的客户端
 HelloService client = (HelloService)factory.create(serviceModel, serviceURL);
 /**
  * Invoke the service
  * @see 调用服务的本地代理(即实际的客户端)中的方法,便得到我们需要的WebServcie
  */
 /*--处理简单对象--*/
 String serviceResponse = client.sayHello("Jadyer11");
 System.out.println(serviceResponse);
 /*--处理对象--*/
 User u = new User();
 u.setName("Jadyer99");
 Person pp = client.getPerson(u);
 System.out.println(pp.getName());
 /*--处理List--*/
 List<Person> personList = client.getPersonList(24, "Jadyer88");
 for(Person p : personList){
  System.out.println(p.getName());
 }
 }
} 

这是它要用到的接口和两个POJO类

/**
 * Web服务提供给客户端的接口
 * @see 这是第二种方式创建的客户端,要用到的接口
 */
package com.jadyer.server;
import java.util.List;
import com.jadyer.model.Person;
import com.jadyer.model.User;
public interface HelloService {
 public String sayHello(String name);
 public Person getPerson(User u);
 public List<Person> getPersonList(Integer age, String name);
}
/**
 * 第二种方式创建的客户端,要用到的两个POJO类
 */
package com.jadyer.model;
public class User {
 private String name;
 /*--getter和setter略--*/
}
package com.jadyer.model;
public class Person {
 private Integer age;
 private String name;
 /*--getter和setter略--*/
} 

第三种方式:使用Ant通过WSDL文件来生成客户端

package com.jadyer.client;
/**
 * 使用Ant通过WSDL生成客户端
 * @see 这里的ClientFromAnt.java是我自己创建的,并非Ant生成
 * @see 这里要用到的JAR有:xfire-all-1.2.6.jar以及//xfire-distribution-1.2.6//lib//目录中的所有JAR包
 * @see 我们需要把这些JAR包都拷贝到Web Project//WebRoot//WEB-INF//lib//目录中
 * @see 然后把build.xml和MyFirstXFireServer.wsdl都拷贝到下Web Project的根目录下即可
 * @see 关于MyFirstXFireServer.wsdl文件,是我在WebServices服务启动后
 * @see 访问http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl然后将其另存得到的
 */
public class ClientFromAnt {
 public static void main(String[] args) {
 XFireServerClient client = new XFireServerClient();
 //String url = "http://127.0.0.1:8080/XFire_demo/services/XFireServer";
 //String result = client.getXFireServerHttpPort(url).sayHello("Jadyer33");
 //上面的两行代码,与下面的这一行代码,同效~~
 String result = client.getXFireServerHttpPort().sayHello("Jadyer33");
 System.out.println(result);
 }
} 

用到的Ant文件,如下

<?xml version="1.0" encoding="UTF-8"?>
<project name="wsgen" default="wsgen" basedir=".">
 <path id="classpathId">
 <fileset dir="./WebRoot/WEB-INF/lib">
  <include name="*.jar" />
 </fileset>
 </path>
 <taskdef classpathref="classpathId" name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask"/>
 <target name="wsgen" description="generate client">
 <wsgen outputDirectory="./src/" wsdl="MyFirstXFireServer.wsdl" binding="xmlbeans" package="com.jadyer.client" overwrite="true"/>
 </target>
</project> 

也可以使用下面的这个Ant文件

<?xml version="1.0" encoding="UTF-8"?>
<project name="xfireAnt" basedir="." default="createClientCode">
 <property name="xfirelib" value="${basedir}/WebRoot/WEB-INF/lib"/>
 <property name="sources" value="${basedir}/src"/>
 <path id="classpath">
 <fileset dir="${xfirelib}">
  <include name="*.jar"/>
 </fileset>
 </path>
 <target name="createClientCode">
 <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="classpath"/>
 <wsgen outputDirectory="${sources}" wsdl="http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl" package="com.jadyer.client" overwrite="true"/>
 </target>
</project> 

最后我再把MyFirstXFireServer.wsdl的内容,附加上

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.jadyer.com/XFireDemo"
xmlns:tns="http://www.jadyer.com/XFireDemo"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"
xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:types>
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   attributeFormDefault="qualified"
   elementFormDefault="qualified"
targetNamespace="http://www.jadyer.com/XFireDemo">
  <xsd:element name="sayHello">
  <xsd:complexType>
   <xsd:sequence>
   <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" />
   </xsd:sequence>
  </xsd:complexType>
  </xsd:element>
  <xsd:element name="sayHelloResponse">
  <xsd:complexType>
   <xsd:sequence>
   <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" />
   </xsd:sequence>
  </xsd:complexType>
  </xsd:element>
 </xsd:schema>
 </wsdl:types>
 <wsdl:message name="sayHelloRequest">
 <wsdl:part name="parameters" element="tns:sayHello"></wsdl:part>
 </wsdl:message>
 <wsdl:message name="sayHelloResponse">
 <wsdl:part name="parameters" element="tns:sayHelloResponse"></wsdl:part>
 </wsdl:message>
 <wsdl:portType name="XFireServerPortType">
 <wsdl:operation name="sayHello">
  <wsdl:input name="sayHelloRequest" message="tns:sayHelloRequest">
  </wsdl:input>
  <wsdl:output name="sayHelloResponse" message="tns:sayHelloResponse">
  </wsdl:output>
 </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="XFireServerHttpBinding" type="tns:XFireServerPortType">
 <wsdlsoap:binding style="document" mce_style="document" transport="http://schemas.xmlsoap.org/soap/http" />
 <wsdl:operation name="sayHello">
  <wsdlsoap:operation soapAction="" />
  <wsdl:input name="sayHelloRequest">
  <wsdlsoap:body use="literal" />
  </wsdl:input>
  <wsdl:output name="sayHelloResponse">
  <wsdlsoap:body use="literal" />
  </wsdl:output>
 </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="XFireServer">
 <wsdl:port name="XFireServerHttpPort" binding="tns:XFireServerHttpBinding">
  <wsdlsoap:address location="http://127.0.0.1:8080/XFire_demo/services/XFireServer" />
 </wsdl:port>
 </wsdl:service>
</wsdl:definitions> 

第四种方法

这种方法用到了spring的jar包,是前几天在找XFire+Spring的资料的时候看到的,在这里也是做个记录。同样的,这种方法和上面所提到的第二种方法在客户端都需要与服务器一样的接口,包名也必须一样。

(1)在src目录下新建client.xml(名字并非特定)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <bean id="baseService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean" lazy-init="false" abstract="true"/>
<!-- id的名字作为标识,用于客户端程序中获取service,若有多个service咋在下面添加多个bean即可-->
 <bean id="MathService" parent="baseService">
 <property name="serviceClass">
 <value>service.MathService</value>
 </property>
 <property name="wsdlDocumentUrl">
<value>http://localhost:8080/myservice/mathWebService?wsdl</value>
 </property>
 </bean>
</beans> 

(2)在程序中调用服务代码非常简单

ApplicationContext ctx = new ClassPathXmlApplicationContext("client.xml");
MathService mathService = (MathService)ctx.getBean("MathService");
int result = mathService.add(int one,int two);

第五种办法

先获取到wsdl文件,命名为mathWebService.wsdl放在客户端的src目录下,接着通过程序访问该wsdl文件,并调用需要的方法。

 String wsdl = "mathWebService.wsdl " ; // 对应的WSDL文件
 Resource resource = new ClassPathResource(wsdl);
 Client client = new Client(resource.getInputStream(), null ); // 根据WSDL创建客户实例
 Object[] objArray = new Object[ 2 ];
 objArray[ 0 ] = 2 ;
 obiArray[1] = 3;
  // 调用特定的Web Service方法
 Object[] results = client.invoke( " add " , objArray);
 System.out.println( " result: " + results[ 0 ]);

对于这几种方法,第一种方法如果传递的参数为服务器端的实体对象,这点好像比较麻烦,不知道在客户端建立和服务器端相同的实体类行不行,没有实践,返回结果如果是复杂数据类型的话不知道有没有什么问题,或者如何转换,没有深入研究。而且我个人觉得方法调用不是那么直观。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • ASP.NET中Webservice安全 实现访问权限控制

    一. 概述: Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务.它逻辑性的为 其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.由于它通过internet进行调用,必然存在网络用户都可以调用的安全问题.如何实现webservice的访问 权限限制,是使用webservice用户

  • Java编程中使用XFire框架调用WebService程序接口

    JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊.但就算是伤心,我们也还是要完成的.JAVA也不乏比较好的实现,如xfire,jersey,CXF. 这里我们就一起来看一下xfire的实现. 1)首先,当然是要下包啦,这个普通人都知道.http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distr

  • java webservice上传下载文件代码分享

    本文实例为大家分享了java webservice上传下载文件代码,供大家参考,具体内容如下 1.新建动态web工程youmeFileServer,新建包com,里面新建类FileProgress package com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Date; import java.text.Simple

  • android调用WebService实例分析

    本文实例讲述了android调用WebService的方法.分享给大家供大家参考.具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Androi

  • C# WebService发布以及IIS发布

    首先我们要做的就是先把IIS(Internet信息服务)打开,我用的是win8 的系统,所以这里以win8系统的操作来讲 一.IIS的一些事先操作 1.打开控制面板,然后进入程序 2.进入程序以后我们找到 启用或关闭Windows功能 3.进入以后把  Internet信息服务  的都选上,单击"确定" 上述的步骤好了以后我们退回到控制面板  ,找到   系统和安全 里面的  管理工具     点击"管理工具"    ,第一个就是我们的IIS了,双击打开它 我们会弹

  • 基于JQuery的访问WebService的代码(可访问Java[Xfire])

    我仔细看看了看看几个人的例子,发现了问题.众所周知WebService是遵守SOAP协议的,为什么例子都是JSON格式的参数传递?net WebService兼容JSON格式,而Java的是标准WebService,不兼容JSON.看来net害了大家啊.于是我仔细了解了WSDL文件,做了个例子.下面只放关键代码. 复制代码 代码如下: $(function () { $("#btnWs").click(btnAjaxPost); }); function btnAjaxPost(eve

  • ajax跨域调用webservice的实现代码

    最近ajax访问webservice遇到跨域的问题,网上搜索资料,总结如下(很多都是觉得人家总结不错的复制下来) <<用JSON来传数据,靠JSONP来跨域>> 先上我的已实现代码: 前端代码: $.ajax({ type: "get", url: "http://localhost/Service1.asmx/getElevatorStatusJsonData?jsoncallback=?", dataType: "jsonp&q

  • PHP使用SOAP扩展实现WebService的方法

    本文实例讲述了PHP使用SOAP扩展实现WebService的方法.分享给大家供大家参考,具体如下: 最近在一个PHP项目中对接外部接口涉及到WebService,搜索引擎上相关文章不是很多,找到的大都是引用一个号称很强大的开源软件NuSOAP(下载地址:http://sourceforge.net/projects/nusoap/),即一些类.文章写描述的环境是PHP 4.3,现在都流行PHP 5.2或PHP 5.3了.先拿来试试,运行出错,原来NuSOAP提供的soapclient类与PHP

  • ASP.NET使用WebService实现天气预报功能

    本文使用Asp.Net (C#)调用互联网上公开的WebServices(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实现天气预报,该天气预报 Web 服务,数据来源于中国气象局http://www.cma.gov.cn/,数据每2.5小时左右自动更新一次,准确可靠.包括 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预报数据. 效果图 : 步骤 : 1 .新建web 项目,添加窗体. 2 . 引用右键

  • 使用jQuery Ajax 请求webservice来实现更简练的Ajax

    在以往我们在做ajax时,都要借助于一般处理程序(.ashx)或web服务(.asmx),并且每一个请求都要建一个这样的文件.这样建一大堆ashx文件,比较麻烦,多了看起来也不爽. 现在我们可以借助webMethod方法来使ajax实现起来更加简练 1,既然要用WebMethod,那肯定就少不了引用一下命名空间了 using System.Web.Services; 在这里,为方便开发,我新建了一个页面专门用于写WebMethod方法.那样会比较方便,也比较好管理. 如果ajax请求比较多,可以

随机推荐