>  기사  >  Java  >  XFire를 사용하여 웹 서비스 클라이언트를 구축하는 5가지 방법

XFire를 사용하여 웹 서비스 클라이언트를 구축하는 5가지 방법

高洛峰
高洛峰원래의
2017-01-24 09:23:071390검색

JSR 181 Annotations의 관련 응용 프로그램은 포함되지 않습니다. 구체적인 세 가지 방법은 다음과 같습니다.

① WSDL 주소를 통해 동적 클라이언트를 생성합니다.
② 제공되는 인터페이스를 통해 클라이언트를 생성합니다. server
③ 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>

네 번째 방법

이 방법은 며칠 전에 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로 지정하고 넣어주세요 그런 다음 프로그램을 통해 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 중국어 홈페이지에 지원하고 싶습니다!

XFire가 웹 서비스 클라이언트를 구축하는 5가지 방법과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.