WebService的两种客户端调用方式

[align=center][size=small]WebService的两种客户端调用方式[/size][/align]

1.先搭建一个WebService接口.

接口类:
package hello;

public interface IHello {

public String hello(String str,String str2) ;

}


实现类:
package hello;

public class Hello implements IHello{

public String hello(String str,String str2) {
return "Hello world ,i'am "+str+". 第二个参数 = "+str2 ;
}

}


services.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>Hello</name>
<namespace>rcfeng</namespace>
<serviceClass>hello.IHello</serviceClass>
<implementationClass>hello.Hello</implementationClass>
</service>
</beans>


web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>



注:这里使用XFire搭建WebService,固然需要引用XFire包,以及写法为XFire,不管用什么框架搭建WebService,访问原理都是一样的,所以用任何的客户端都可以访问,需要导入的包在文章尾部注明.


2.下面介绍调用WebService的两种客户端:

2.1 XFire客户端:

XFire客户端访问WebService,需要模拟出WS的接口,接口的结构一般定义接口的服务商会提供,如果是自己写的那就更明确了..

模拟WebService接口(这个接口写法跟WS服务器是一样的,但不是同一个项目也不是同一个类):

客户端接口类:
这里起名AnyName,意思是任何模拟接口的任何名字都可以,只要需要调用的方法的结构与WS相同即可.
package xfire;

public interface IAnyName {

public String hello(String str,String str2) ;

}



客户端调用类,测试类:
package xfire;

import org.codehaus.xfire.XFire;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class XFireTest {

public static void main(String[] args) {

try {

String url = "http://localhost:9415/rcfeng-WebService/services/Hello" ;

Service service = new ObjectServiceFactory().create(IAnyName.class) ;

// XFire fire=XFireFactory.newInstance().getXFire();
// XFireProxyFactory factory=new XFireProxyFactory(fire);
XFireProxyFactory factory = new XFireProxyFactory() ;

IAnyName hello = (IAnyName) factory.create(service,url) ;

String str = hello.hello("rcfeng","Parameter two") ;

System.out.println(str);

} catch (Exception e) {
e.printStackTrace();
}

}
}


2.2 Axis客户端:
package axis;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

public class AxisTest {

public static void main(String[] args) {

try {

String str = "rcfeng" ;
String endpoint = "http://localhost:9415/rcfeng-WebService/services/Hello" ;

Service service = new Service() ;

Call call = (Call) service.createCall() ;

call.setTargetEndpointAddress(endpoint) ;
call.setOperationName("hello") ;//ws方法名
//一个输入参数,如果方法有多个参数,复制多条该代码即可,参数传入下面new Object后面
call.addParameter("parameter1",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;
call.addParameter("parameter2",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;
call.setReturnType(XMLType.XSD_STRING) ;
call.setUseSOAPAction(true) ;
// call.setSOAPActionURI("http://172.20.35.123:6110/cea-ws/services/ChangeMemberPinService");

String result = (String) call.invoke(new Object[]{str,"Parameter two"}) ;

System.out.println(result);

} catch (Exception e) {
e.printStackTrace();
}
}
}




以上代码本人测试通过.

顺便说一点个人理解:


XFire客户端的调用方式,类似于先指定WS接口的结构,然后从远端地址实例化一个对象到本地,由于方法结构一样,所以可以强行转换.然后直接进行本地调用.

Axis客户端的调用方式类似于HTTP访问,设置好参数后直接远端调用.


?wsdl地址的来源=服务商提供,如果是你自己做的WebService的话,你可以访问默认格式:

http://[IP地址:端口]/[项目访问路径]/services



http://localhost:9415/rcfeng-WebService/services


至于url的源来,你要先拿到?wsdl地址,然后访问如:

http://localhost:9415/rcfeng-WebService/services/Hello?wsdl ,然后拉到下面可以看到红色部分:
<wsdl:service name="Hello">
<wsdl:port name="HelloHttpPort" binding="tns:HelloHttpBinding">
<wsdlsoap:address location="[color=red][b]http://localhost:9415/rcfeng-WebService/services/Hello[/b][/color]" />
</wsdl:port>
</wsdl:service>

调用的方法名为:
<wsdl:operation name="[color=red][b]hello[/b][/color]">


然后便可以调用WebService的接口了。


XFire需要用到的包:
activation-1.1.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-httpclient-3.0.jar
commons-logging-1.0.4.jar
jaxen-1.1-beta-9.jar
jaxws-api-2.0.jar
jdom-1.0.jar
jsf-api.jar
jsf-impl.jar
jsr173_api-1.0.jar
jstl-1.2.jar
mail-1.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
spring-1.2.6.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.0.jar
xbean-2.2.0.jar
xbean-spring-2.8.jar
xfire-aegis-1.2.6.jar
xfire-annotations-1.2.6.jar
xfire-core-1.2.6.jar
xfire-java5-1.2.6.jar
xfire-jaxws-1.2.6.jar
xfire-jsr181-api-1.0-M1.jar
xfire-spring-1.2.6.jar
XmlSchema-1.1.jar

Axis需要用到的包:
axis.jar
commons-discovery-0.2.jar

注明:以上两种客户端本人是写在同一个项目里,所以Axis需要用到的包看上去少很多,是因为一些通用包在使用XFire的时候已经加进来了.

附上项目说明:
rcfeng-WebService 为WebService服务端项目
rcfeng-TestWebService 为客户端项目

rcfeng-WebService项目中没有包,可以到rcfeng-TestWebService\WebRoot\WEB-INF\lib\XFire\下获取,另外,rcfeng-WebService项目中是使用MyEclipse引用包,直接导入项目可能需要更新jar路径或删掉路径,然后自己导入jar包
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值