ホームページ >Java >&#&チュートリアル >XFire を使用して Web サービス クライアントを構築する 5 つの方法
これには、JSR 181 アノテーションの関連アプリケーションは含まれません。具体的な 3 つの方法は次のとおりです。
① 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]); } }
2 番目の方法: サーバーによって提供されるポートを使用してクライアントを作成する
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()); } } }
これは用途 インターフェイスと 2 つの 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略--*/ }
3 番目の方法: 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>
4 番目の方法
この方法は、最初のいくつかの Spring jar パッケージを使用しますXFire+Springについて調べていたら見かけたのでこちらにも記録しておきます。同様に、この方法と上記の 2 番目の方法では、クライアント上にサーバーと同じインターフェイスが必要で、パッケージ名も同じである必要があります。
(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);
5 番目の方法
まず、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 ]);
これらのメソッドですが、最初のメソッドで渡されるパラメータがサーバー側のエンティティオブジェクトである場合、同じエンティティクラスを作成できるかどうかはわかりません。クライアント側もサーバー側と同じです。実際には、返された結果が複雑なデータ型である場合、問題があるかどうか、またはそれを変換する方法は詳しく調べていません。また、個人的には、メソッド呼び出しはそれほど直感的ではないと感じています。
以上がこの記事の内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。また、PHP中国語ウェブサイトも応援したいと思っています。
Web サービス クライアントを構築する XFire の 5 つの方法に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。