WebService 的关键名词
1.XML:(Extensible Markup Language)扩展型可标记措辞。和Json类似,也是一种标准的数据格式,WebService底层必须通过XML格式进行数据传输,由于SOAP协议底层是基于XML格式的,SOAP是XML文档形式的调用方法的规范。
2.Soap:(Simple Object Access Protocol)大略工具存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过SOAP调用你建立的Web做事中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
3.WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于解释WebService做事端发布出来的接口信息,比如有哪些接口方法,入参的详细信息等。
4.UDDI (Universal Description, Discovery, and Integration) 是一个紧张针对Web做事供应商和利用者的新项目。在用户能够调用Web做事之前,必须确定这个做事内包含哪些接口方法,找到被调用的接口定义,UDDI是一种根据描述文档来勾引系统查找相应做事的机制。UDDI利用SOAP机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采取XML格式来封装各种不同类型的数据,并且发送到注册中央或者由注册中央来返回须要的数据。普通地说便是用来勾引客户端去创造做事端发布了哪些接口方法,然后按照WSDL解释通过SOAP协议进行调用的一个过程。
WebService的常用框架1.JWS是Java措辞对WebService做事的一种实现,用来开拓和发布做事。而从做事本身的角度来看JWS做事是没有措辞界线的。但是Java措辞为Java开拓者供应便捷发布和调用WebService做事的一种路子,现在没人利用了,已经成为历史
2.XFire是一个高性能的WebService框架,在Java6之前,它的有名度乃至超过了Apache的Axis2,XFire的优点是开拓方便,与现有的Web整合很好,可以融为一体,并且开拓也很方便。但是对Java之外的措辞,没有供应干系的代码工具。XFire后来被Apache收购了,缘故原由是它太精良了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,逐渐地都败落了,现在没人利用了,已经成为历史
3.Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以天生Java和其他措辞版WebService客户端和做事端代码。这是它的上风所在。但是,这也不可避免地导致了Axis2的繁芜性,利用过的开拓者都知道,它所依赖的包数量和大小都是很惊人的,打包支配发布都比较麻烦,不能很好的与现有运用整合为一体
4.CXF是Apache旗下一个重磅的SOA大略单纯框架,它实现了ESB(企业做事总线)。CXF来自于XFire项目,经由改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,终极会淡出人们的视线。CXF不但是一个精良的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的履行供应了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分,供应方便的Spring整合方法,可以通过表明、Spring标签式配置来暴露Web Services和消费Web Services
基于SpringBoot集成WebService上面先容了WebService是什么以及WebService常用专业词汇还有框架,下面用Java措辞为例给大家先容怎么在springBoot框架中集成WebService的CXF,废话不多说,开始操作吧。
1.maven配置文件添加以下配置信息,如果是Gradle,可以按照Gradle进行配置
<!-- cxf start --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.2.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.2.6</version> </dependency> <!-- cxf end -->
2.CXF注入配置,在springBoot的启动的时候加载该配置,要重点关注下面dispatchServlet方法配置的路径/ele/webService/和endpoint的/wb,这两个配置是用来连起来访问WSDL解释的,比如这个WebService做事端发布出来的解释就可以这样访问:http://做事ip地址:springBoot启动端口/ContentPath/ele/webService/wb?wsdl,ContentPath是spring做事的接口前缀,这个不理解可以自行百度,如果没有可以不用配置ContentPath
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.beans.factory.annotation.Autowired;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.xml.ws.Endpoint;/ @version v1.0 @Description: TODO @author: guoker @date: 2021/7/5 12:08 /@Configurationpublic class CxfConfig { @Autowired private WebServiceTest webServiceTest; / 此方法浸染是改变项目中做事名的前缀名,此处127.0.0.1或者localhost不能访问时,请利用ipconfig查看本机ip来访问 此方法被注释后:wsdl访问地址为http://127.0.0.1:8080/services/user?wsdl 去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/soap/user?wsdl @return / @Bean public ServletRegistrationBean dispatchServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/ele/webService/"); return servletRegistrationBean; } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } / JAX-WS 站点做事 / @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), webServiceTest); endpoint.publish("/wb"); return endpoint; }
3.编写发布的接口做事
import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;@WebService(name = "WebServiceTest", targetNamespace = "http://service.webservice.kexin.com")public interface WebServiceTest { @WebMethod @WebResult(name = "String", targetNamespace = "") String getUserByName(@WebParam(name = "username") String username, @WebParam(name = "userpwd") String userpwd, @WebParam(name = "usertype") String usertype) throws Exception;}
4.编写发布接口的实现类
import org.springframework.stereotype.Component;import javax.jws.WebService;/ @version v1.0 @Description: TODO @author: guoker @date: 2021/7/5 11:31 /@WebService(endpointInterface = "com.dxhy.bxsdk.business.service.WebServiceTest", targetNamespace = "http://service.webservice.kexin.com", serviceName = "WebServiceTest")@Componentpublic class WebServiceTestImp implements WebServiceTest { @Override public String getUserByName(String username, String userpwd, String usertype) throws Exception { return "hello WebService"; }}
WebService客户端调用示例
/ 2:动态调用 / public static void main() { // 创建动态客户端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://127.0.0.1:8184/bx/ele/webService/wb?wsdl"); // 须要密码的情形须要加上用户名和密码 // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD)); Object[] objects = new Object[0]; try { // invoke("方法名",参数1,参数2,参数3....); objects = client.invoke("getUserByName", "guoker", "123456", "测试类型"); System.out.println("返回数据:" + objects[0]); } catch (java.lang.Exception e) { e.printStackTrace(); } }