SpringBoot开发webservice接口

SpringBoot项目开发WebService接口

最近公司项目需要提供webservice接口供第三方调用,这里简单做一下总结:

a. webservice是什么?

Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。

Web Service技术具有以下特点:

使运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,可相互交换数据或集成。

依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。

Web Service容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。

Web Service减少了应用接口的花费,为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

web service接口实际上就是RPC调用的一种实现。

b. 相关概念

XML:XML是在web上传送结构化数据的伟大方式,Web services要以一种可靠的自动的方式操作数据,HTML(标准通用标记语言下的一个应用)不会满足要求,而XML可以使web services十分方便的处理数据,它的内容与表示的分离十分理想;

SOAP:SOAP是simple object access protocal的缩写,即简单对象访问协议。是基于XML和HTTP的一种通信协议,是webservice所使用的一种传输协议,webservice之所以能够做到跨语言和跨平台,主要是因为XML和HTTP都是独立于语言和平台的.Soap的消息分为请求消息和响应消息,一条SOAP消息就是一个普通的XML文档,包含下列元素:

-必需的 Envelope 元素,可把此XML文档标识为一条SOAP消息

-可选的 Header 元素,包含头部信息

-必需的 Body 元素,包含所有的调用和响应信息

-可选的 Fault 元素,提供有关在处理此消息所发生错误的信息,soap请求消息,soap响应消息.

WSDL:Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

UDDI:UDDI是Universal Description Discovery and Integration的缩写,即统一描述、发现和整合规范。用来注册和查找服务,把web services收集和存储起来,这样当别人访问这些信息的时候就从UDDI中查找,看有没有这个信息存在。

SEI: WebService EndPoint Interface(webservice终端[Server端]接口)就是 WebService服务器端用来处理请求的接口。

c. 入门案例

  1. 新建springboot项目,导入pom依赖
点击查看代码
<!--webservice start-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
    <version>3.4.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.4.3</version>
</dependency>
  1. 编写service接口
点击查看代码
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(
        name = "MyWebService", // 暴露服务名称
        targetNamespace = "http://webservice.user.com"// 命名空间,一般是接口的包名倒序
)
public interface MyWebService {
   @WebMethod
   public String show(String name);
}
  1. 编写service接口实现类
点击查看代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.jws.WebService;

@Service
@WebService(serviceName = "MyWebService", // 与接口中指定的name一致, 都可以不写
        targetNamespace = "hhttp://webservice.user.com", // 与接口中的命名空间一致,一般是接口的包名倒,都可以不用写
        endpointInterface = "com.user.webservice.MyWebService" // 接口类全路径
)
public class MyWebServiceImpl implements MyWebService {
    @Autowired
    private UserService userService;

    @Override
    public String show(String name) {
        System.out.println(">>>>>>>>获取到请求参数:" + name);
        String value = name + "-" + userService.info();
        return value;
    }
}
  1. 编写配置类,发布服务
点击查看代码
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;

@Configuration
public class WebServiceConfig {
    @Autowired
    private MyWebService myWebService;

    @Autowired
    private Bus bus;

    /**
     * 发布服务
     * @return
     */
    @Bean
    public Endpoint userServiceEndpoint() {
        //这里指定的端口不能跟应用的端口冲突, 单独指定
        String path = "http://127.0.0.1:9090/user";

        EndpointImpl userEndpoint = new EndpointImpl(bus, myWebService);
        userEndpoint.publish(path);

        System.out.println("服务发布成功,在线的wsdl:%s?wsdl" + path);
        return userEndpoint;
    }
}

启动项目,查看后台发布信息

将地址赋值到浏览器并打开,显示如下内容,说明服务发布成功。

  1. 生成客户端代码,测试服务端接口

新建clent包并选中,点击Tools-WebServices-Generate Wsdl From- Java Code

输入发布服务地址,点击ok

生成如下代码,手动将class文件删除

  1. 新建测试类Test.java
点击查看代码
public class Test {
    public static void main(String[] args) {
        MyWebService_Service service = new MyWebService_Service();
        String name = service.getMyWebServiceImplPort().show("reindeer");
        System.out.println(">>>>>"+name);
    }
}

执行main方法,输出信息如下:

posted @ 2022-07-29 11:44  时光巷陌  阅读(6898)  评论(5编辑  收藏  举报