webservice咋么用?这么干就完事了!
-----------------直接上干货---------------
1.添加pom依赖
<!-- CXF webservice --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
2.创建接口
import javax.jws.WebService; /** * @author: pan.lei * @version: 2021年1月27日 下午2:22:17 */ @WebService(name = "WmsServiceProduct", // 暴露服务名称 targetNamespace = "http://product.facade.com"// 命名空间,一般是接口的包名倒序 ) public interface WmsServiceProduct { int getProductInfo(Header header, ProductRequest request); }
3.创建接口实现类
import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import com.alibaba.fastjson.JSONArray; /** * @author: pan.lei * @version: 2021年1月27日 下午2:32:04 */ @WebService(name = "WmsServiceProduct", targetNamespace = "http://product.facade.com", endpointInterface = "facade.product.WmsServiceProduct"// 接口地址 ) public class WmsServiceProductImpl implements WmsServiceProduct { @WebMethod @Override public int getProductInfo(@WebParam(name = "header") Header header, @WebParam(name = "body") ProductRequest request) { List<Product> product = JSONArray.parseArray(request.getInputParameter(), Product.class); for(Product p : product) { System.out.println(p.toString()); } return 1; } }
注意:实现类中将接口参数直接转换成了对象,使用到了JSONArray,关于json转对象或对象转json,以下是几个简单案例:
/** * json字符串转化为对象 */ String jsonString = "{name:'Antony',age:'12',sex:'male',telephone:'88888'}"; Person person= JSON.parseObject(jsonString, Person .class); System.out.println(staff.toString()); /** * 对象转化为json字符串 */ String jsonStr = JSON.toJSONString(person); System.out.println(jsonStr); /** * json字符串直接转为List<java>对象 */ List<Person > list = JSONArray.parseArray(jsonData, Person .class);
4.创建配置类
package com.facade.product; import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; /** * @author: pan.lei * @version: 2021年1月28日 上午9:54:22 */ @Configuration public class CxfConfig { @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(), "/services/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public WmsServiceProduct wmsServiceProduct() { return new WmsServiceProductImpl(); } @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), wmsServiceProduct()); endpoint.publish("/wmsServiceApi"); return endpoint; } }
5.启动服务,浏览器访问接口地址
http://localhost:8087/services/wmsServiceApi?wsdl

6.生成客户端代码
使用jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。

7.将客户端代码拷贝到自己的项目下,编写测试
@org.junit.Test public void test() { WmsServiceProductImplService serviceProductImplService = new WmsServiceProductImplService(); Header header = new Header(); header.setUsername("wangwu"); header.setPassword("456"); ProductRequest request = new ProductRequest(); request.setFuncType("出库单"); request.setInputParameter("[{\r\n" + " \"code\":\"c011020201\",\r\n" + " \"name\":\"手机\",\r\n" + " \"description\":\"华为手机\",\r\n" + " \"category\":\"\"\r\n" + "},{\r\n" + " \"code\":\"c011020201\",\r\n" + " \"name\":\"手机\",\r\n" + " \"description\":\"华为手机\",\r\n" + " \"category\":\"\"\r\n" + "}]"); int i = serviceProductImplService.getWmsServiceProductPort().getProductInfo(header, request); }

8.也可用soapui测试

9.如果接口是简单参数,并非复杂参数(对象),可以使用地址动态调用,不用生成客户端代码
@org.junit.Test public void test() { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:8087/services/wmsServiceApi?wsdl"); // 需要密码的情况需要加上用户名和密码 // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD)); HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(2000); // 连接超时 httpClientPolicy.setAllowChunking(false); // 取消块编码 httpClientPolicy.setReceiveTimeout(120000); // 响应超时 conduit.setClient(httpClientPolicy); // client.getOutInterceptors().addAll(interceptors);//设置拦截器 try { Object[] objects = new Object[0]; // invoke("方法名",参数1,参数2,参数3....); objects = client.invoke("getProductInfo", "",""); System.out.println("返回数据:" + objects[0]); } catch (Exception e) { e.printStackTrace(); } }
-----------------干完收工---------------
后话:关于WebService一些知识点拓展(✿◡‿◡跟别人抄的)
WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。
为什么使用WebService?
简单解释一下WebService,比如你的项目需要查询某银行账户余额。你能直接查吗,肯定不行,因为数据库是银行的,他不可能给你权限。你想访问他的数据库获取数据,这就需要用到WebService。通过调用银行暴露的接口来得到你想要的数据。
适用场景:
软件的集成和复用,如气象局(服务端系统)、天气查询网站等。
- 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议WebService
- 服务端已经确定使用webservice,客户端不能选择,必须使用WebService
软件集成:通过远程调用技术,将两个系统整合到一起,从而实现软件集成。
软件复用:同一个款软件的多次集成,最终实现复用。
不适用场景:
- 考虑性能时不建议使用WebService
- 同构程序下不建议使用WebService
Axis2与CXF的区别
目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。
| 区别 | Axis2 | CXF |
|---|---|---|
| 简述 | WebService引擎 | 简易的SOA框架,可以作为ESB |
| spring集成 | 不支持 | 支持 |
| 应用集成 | 困难 | 简单 |
| 是否跨语言 | 是 | 否 |
| 部署方式 | web应用 | 嵌入式 |
| 服务的管控和治理 | 支持 | 不支持 |

浙公网安备 33010602011771号