最近项目中有些地方相互调用的时候,并不是采用Http(post/get)方式来实现,而是通过webservice方式来实现,之前虽然也接触过webservice的方式,但一直没有机会研究一下,只是依葫芦画瓢去模仿写,也没有自己单独搭建一个webservice的服务出来。这几天正好有空,做一下笔记,有什么地方写的不好的,或者表达的不明确的,希望大家留言。
WebService是一种跨编程语言、跨操作系统平台的远程调用技术。
这个问题我也是从百度上抄的,但是我还是希望大家能稍微看下,了解一下这个一些名词解释。
首先明确一点:webservice也算是http的一种传输方式。为什么这么说呢?
首先webservice是基于soap协议,而soap协议是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml任何数据都可以xml化。
HTTP是SOAP消息的最常见的传输工具
开发工具: idea
springboot版本:2.2.4
maven引入2个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
解释下这两个jar包:
新建一个接口WebServiceDemoService
package com.cj.webservice.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
@WebService
public interface WebServiceDemoService {
@WebMethod
public String hello(@WebParam(name = "name") String name);
}
@WebService:标明是个webservice服务,发布的时候会带上这个类。
@WeBMethod:webservice中发布的方法
@WebParam:对参数的别名,不写也不影响,但是参数在wsdl中看起来是arg0,不利于理解。
package com.cj.webservice.service;
import org.springframework.stereotype.Service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* 描述:
*
* @author caojing
* @create 2020-02-14-14:56
*/
@WebService(serviceName = "fileDeviceService",//对外发布的服务名
targetNamespace = "http://service.webservice.cj.com",//指定你想要的名称空间,通常使用使用包名反转
endpointInterface = "com.cj.webservice.service.WebServiceDemoService")
@Service
public class WebServiceDemoServiceImpl implements WebServiceDemoService {
@Override
public String hello(String name) {
return "hello" + name;
}
}
该写的注释我已经写了兄弟们,你们看一看,瞧一瞧。
package com.cj.webservice.config;
import com.cj.webservice.service.WebServiceDemoService;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
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 org.apache.cxf.transport.servlet.CXFServlet;
import javax.xml.ws.Endpoint;
/**
* 描述:webservice 配置类
* * @author caojing
* @create 2020-02-14-14:47
*/
@Configuration
public class WebServiceConfig {
@Autowired
private WebServiceDemoService webServiceDemoService;
//* 此方法被注释后:wsdl访问地址为http://127.0.0.1:8080/services/user?wsdl
// * 去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/webservice/user?wsdl
@Bean(name = "cxfServlet")
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/webservice/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean(name = "webServiceDemoEndPoint")
public Endpoint webServiceDemoEndPoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), webServiceDemoService);
endpoint.publish("/webservice");
return endpoint;
}
//如果有其余的服务,继续加
}
cxfServlet 和springBus 两个方法都不要改动,如果有新的服务进来,直接再添加一个endPoint的方法,加入到服务中去。
日志如上所示则表明启动成功。
访问地址:http://127.0.0.1:8080/webservice/webservice?wsdl
如下图所示:
至此服务段的代码都已经完成,我们创建一个webservice服务,这个服务器就是你传的参数,返回给你 “heelo” + 参数。
这里我说两种方式来测试下webservice服务:
第一步,把刚才的打的jar包作为lib导入到idea中,这个不会的,请出门右转,自行百度。
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
import com.cj.webservice.service.WebServiceDemoService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
* 描述:
*
* @author caojing
* @create 2020-02-14-15:37
*/
public class test {
static WebServiceDemoService webServiceDemoService;
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(WebServiceDemoService.class);
factory.setAddress("http://localhost:8080/webservice/webservice");
webServiceDemoService = (WebServiceDemoService) factory.create();
System.out.println(webServiceDemoService.hello("cj"));
}
}
啰嗦了这么久,终于结束了。。。。。。
我总结一下springboot中集成webservice的几个点。
服务端代码
客户端代码