加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用XFire开发WebServices客户端

发布时间:2020-12-17 01:08:20 所属栏目:安全 来源:网络整理
导读:? 本文所用到的WebServices服务端,取自我的上一篇文章中的例子—— 使用XFire开发WebServices服务端 ? 这里并未涉及到 JSR?181?Annotations ? 的相关应用,具体的三种方式如下 ① ? 通过WSDL地址来创建动态客户端 ? ② ? 通过服务端提供的接口来创建客户端
?

本文所用到的WebServices服务端,取自我的上一篇文章中的例子——使用XFire开发WebServices服务端?
这里并未涉及到JSR?181?Annotations?的相关应用,具体的三种方式如下
?通过WSDL地址来创建动态客户端?
?通过服务端提供的接口来创建客户端?
?使用Ant通过WSDL文件来生成客户端


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

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

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

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;??
  • 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;??
  • }??
  • 第三种方式:使用Ant通过WSDL文件来生成客户端

    ?*?使用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"?>??
    1. <project?name="wsgen"?default="wsgen"?basedir=".">??
    2. ????<path?id="classpathId">??
    3. ????????<fileset?dir="./WebRoot/WEB-INF/lib">??
    4. ????????????<include?name="*.jar"?/>??
    5. ????????</fileset>??
    6. ????</path>??
    7. ??????
    8. ????<taskdef?classpathref="classpathId"?name="wsgen"?classname="org.codehaus.xfire.gen.WsGenTask"/>??
    9. ????<target?name="wsgen"?description="generate?client">??
    10. ????????<wsgen?outputDirectory="./src/"?wsdl="MyFirstXFireServer.wsdl"?binding="xmlbeans"?package="com.jadyer.client"?overwrite="true"/>??
    11. ????</target>??
    12. </project>??

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

    <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"/>??
  • ????<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的内容,附加上

    <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: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>
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读