一、cxf实现客户端
1、引入依赖
<!-- 要进行jaxws 服务开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty web服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
2、代码
@WebService
public interface HelloService {
/**
* 对外发布服务的接口的方法
* 与上篇的讲的服务端一样的接口
*/
String sayHello(String name);
//User就是简定义的实体类,成员变量分别是id,addr,name,类型都为String
User addUser(User user);
void test(String a, String b);
}
public class Client {
public static void main(String[] args) {
// 服务接口访问地址:http://localhost:8000/ws/hello
// 创建cxf代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 设置远程访问服务端地址
factory.setAddress("http://localhost:8000/ws/hello");
// 设置接口类型
factory.setServiceClass(HelloService.class);
//factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
// 对接口生成代理对象
HelloService helloService = factory.create(HelloService.class);
// 代理对象对象 class com.sun.proxy.$Proxy34 [Java代理: 1. 静态代理; 2.动态代理(jdk接口代理、cglib子类代理)] $CGLIB123
System.out.println(helloService.getClass());
// 远程访问服务端方法
String content = helloService.sayHello("Jet");
System.out.println(content);
}
}
先运行之前的服务端,然后再运行这里的客户端,这样就在不同系统间用webService进行了接入通信 。
二、wsdl
若是自己写客户端,然后自己写客户端,这样你自然是能写出客户端的代码。但是有时候,就是涉及用webService去和别家的系统对接数据。这时人家通常会给你一个wsdl链接。要怎么对接这个数据?代码要怎么写,就是通过查看这个wsdl。
wsdl就是webService接口调用说明书。在服务端启动后,就可以在网页中访问webservice服务的wsdl链接,在网页中通过xml的格式,告诉对接这个webService的一些细节问题。
(一)、查看代理类和代理方法
之前写的webService服务接口的wsdl连接是http://localhost:8000/ws/hello?wsdl,在浏览器中直接访问即可,如图
阅读wsdl,需要从下往上读。
在根标签definitions中有三个标签,分别是service、binding和import标签。
1、server标签中,找到这个接口的地址。代理工厂设置访问地址就是这个http://localhost:8000/ws/hello
2、binding标签中,找到服务的代码类以及代理的方法。这里的代理类是HelloService,代理方法是sayHello、test和addUser
3、import标签中,找到namespace,值是service.itheima.com,这个是hellowService类所在的包的包名。不过需要返回过看,即com.itheima.service.
location是一个连接http://localhost:8000/ws/hello?wsdl=HelloService.wsdl,可以在浏览器中访问这个连接,作用是查看每个方法的入参和出参。
(二)、查看方法的入参和出参
之后,还需要看这些方法应该会什么参数,返回什么类型的值。所以访问
http://localhost:8000/ws/hello?wsdl=HelloService.wsdl 如图:
这里也需要从下往上看。
1、portType标签
可以从这里看出,在一个HelloService中有三个方法adduser,test和sayHello.即三个operation标签。
在operation标签中,定义了方法的入参和出参(传入参数与返回参数 )。可是这里仍然不知道方法传入什么,所以需要再其它地方查看。先记住input和output标签中的name属性的值。
比如addUser方法中,分别是adduser和addUserResponse.
注意:在不同的服务端实现,portType这个标签可能不一定有,但是我们之前在http://localhost:8000/ws/hello?wsdl中已经知道了代理类和代理方法。在找下文讲的complexType标签时,记住方法名是入参的定义,方法名+Response是出参的定义,对应去找即可。
2、complexType标签
这时看到顶部,types标签,里面有schema标签,其中会许多complexType标签,看他们的name值,会看到adduser和addUserReponse
这里面就定义了方法的准确的入参和出参。如下图,
刚才addUser是入参,传入参数类型是User。User是什么类型?需要在name为user的complexType中查看。
可以看到User有三个成员属性,addr,id和name。它们的类型都是String。
然后再看addUserResponse,这是出参。返回的也是user类型的数据。若是其它类型的数据,就去找name为这个值的complexType标签查看详细。
至此,就可以明白一个方法应该如何调用。就可以写出我们的代理Service类及方法。如下
@WebService
public interface HelloService {
User addUser(User user);
}
之后,再按照以上步骤,就可以写出完整的Service类。
三、总结
service标签 查看 接口地址
binding标签 查看 接口的代理类和代理方法
import标签 查看 包名和代理方法详细说明地址
complexType标签查看 方法的入参和出参