webservice基础:
个人总结: webservice就是两个不同的web应用之间,一个扮演服务端,一个扮演客户端,服务端发布接口,客户端通过url访问接口,并且使用其中的方法,通过http传输数据,xml保存数据。
概念的东东详细了解参见如下博客: http://www.cnblogs.com/xdp-gacl/p/4048937.html
Demo:
服务端编写:
定义接口:
@WebService
public interface Query {
public String queryName(String name);
}
定义实现类:
@WebService(endpointInterface="com.travelsky.test.service.Query")
public class QueryImpl implements Query{
@Override
public String queryName(String name) {
// TODO Auto-generated method stub
return name;
}
}
发布服务:
public class MainServer
{
public static void main(String[] args)
{
//第一种发布方式:通过CXF提供的JaxWsServerFactoryBean来发布webservice
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(QueryImpl.class);
factory.setAddress("http://localhost:8080/HelloWorld");
Server server = factory.create();
server.start();
//第二种方式,通过JAX-WS提供的Endpoint来发布webservice
//首先创建webservice服务提供类的实例
QueryImpl implementor = new QueryImpl();
String address = "http://localhost:8080/HelloWorld";
Endpoint.publish(address, implementor);
}
}
Spring Boot 发布方式:
@Configuration
public class PushOut {
@Bean
public ServletRegistrationBean servletIDis(){
return new ServletRegistrationBean(new CXFServlet(),"/sky/*");
}
@Bean
public Query query(){
return new QueryImpl();
}
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus bus(){
return new SpringBus();
}
@Bean
public Endpoint endPoint(){
EndpointImpl ep = new EndpointImpl(bus(),query());
ep.publish("/test");
return ep;
}
}
客户端编写:
静态:先用wsimport 读取wsdl文档下载相关代码到本地,再编写客户端代码
WebService-wsimport命令使用: wsimport -d 项目src文件所在路径 -p 生成存在的包的完整名称 -keep(生成java文件)
+发布的wsdl路径名称
第一种(利用cxf或者spring+cxf都一样)
public class TestClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean fc = new JaxWsProxyFactoryBean();
fc.setAddress("http://localhost:8080/HelloWorld?wsdl");
fc.setServiceClass(Query.class);
Query a = (Query) fc.create();
System.out.println(a.queryName("张三"));
}
}
第二种(原生)
public class TestClient {
public static void main(String[] args) throws Exception
{
URL url=new URL("http://localhost:8080/HelloWorld?wsdl");
//这里的参数来源于wsdl文档
QName qName=new QName("http://sky.com/", "Query");
Service service=Service.create(url, qName);
Query my=service.getPort(Query.class);
System.out.println(my.queryName('张三'));
}
}
动态: Spring Boot 客户端调用方式:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/HelloWorld?wsdl");
//反射方法并且调用
Object [ ] object = client.invoke("queryName", '张三');
//输出调用结果
System.out.println(object[0].toString());
注: 这种方式要注意的就是,如果调用的服务接口返回的是一个自定义对象,那么结果Object[]中的数据 类型就成了这个自定义对象(组件帮你自动生成了这个对象),但是你本地可能并没有这个类,所以需要自行转换处理,最简单的是新建一个跟返回结果一模一样的类进行强转,当然更好的方式是封装一个通用的