webservice 服务端配置其实很简单 主要是services.xml文件的配置
Eclipse 创建XFire项目的时候要注意不要忘了选择http client ,特别是在客户端里调用的时候
如果没http client 会报错。
提供者 server 调用者client
server 有完整的接口和实现,而client只需要要由其相应的接口即可,而且interface 名字可以不同,但是method名字一定要相同。
验证:
查看wsdl:注意chrome不能查看wsdl的信息,chrome是默认不显示这些的,我们通过审查元素可以在chrome查看到wsdl。
server段只需要配置好services.xml 就OK啦。主要看Client,Client调用可以通过两种方式调用。
1 自己写Client调用
//1.取得WebService的路径 String url = "http://localhost:8080/testWebService/services/testWebService"; //2.创建服务 Service service = new ObjectServiceFactory().create(Sv.class); //3.创建服务代理 XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); //4.调用外部的WebService,建立对象,再测试其方法 try { Sv obj = (Sv)factory.create(service,url); System.out.println(obj.HelloWorld("Smith")); } catch (MalformedURLException e) { e.printStackTrace(); }
2 生成代码
在客户端项目里面File-->New-->Code generation from wsdl document.
输入服务的wsdl和该Client项目,然后选择要防止的包,Finish。(注意这部操作的时候必须把Service项目用web服务器打开,然后把生成的代码复制到SRC下,删除webroot的)
调用如下:
testWebServiceClient client = new testWebServiceClient (); testWebServicePortType service = client.gettestWebServiceHttpPort(); System.out.println(service.helloWorld("Smith"));
第三种调用方式:
client = new Client(new URL("http://localhost:8080/testWebService/services/testWebService?wsdl")); Object[] results = client.invoke("HelloWorld", new Object[] {"yezhu"}); System.out.println((String) results[0]);
XFire安全验证:
出啦防火墙等外面的拦截,XFire也提供了对安全性的验证。
Server端配置:
1:验证 AuthenticationHandler extends AbstractHandler
2: services.xml 为需要安全验证的<bean>加上
<inHandlers> <handler handlerClass ="com.xxx.AuthenticationHandler" > </handler > </inHandlers> <style>wrapped</style> <use>literal</use> <scope>application</scope>
Client
1: public class ClientAuthenticationHandler extends AbstractHandler
2:测试
Service serviceModel = new ObjectServiceFactory().create(Sv.class); Sv service = (Sv) new XFireProxyFactory().create(serviceModel, "http://localhost:8080/testWebService/services/testWebService"); XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service); Client client = proxy.getClient(); //发送授权信息 client.addOutHandler(new ClientAuthenticationHandler("用户名","密码")); //输出调用web services方法的返回信息 System.out.println(service.dosomething("john "));
如果请求需要验证的话,生成的代码 wsdl2java
Service serviceModel = new ObjectServiceFactory().create(sayhelloPortType.class); sayhelloPortType service = (sayhelloPortType) new XFireProxyFactory().create((org.codehaus.xfire.service.Service) serviceModel,"http://localhost:8080/WebServiceServer/services/sayhello"); XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service); Client client = proxy.getClient(); //发送授权信息 client.addOutHandler(new ClientAuthenticationHandler("abcd","1234")); //输出调用web services方法的返回信息 System.out.println(service.sayHello("jim"));
服务端获得客户端的一些信息这个可以写在AuthenticationHandler,用户每次访问的时候都可以验证IP,同时也可以验证用户名和密 码:
String remoteip= XFireServletController.getRequest().getRemoteAddr(); String uri = cfx.getInMessage().getUri(); System.out.println("服务端得到客户端的ip为:" + remoteip + " URI为:" + uri);