宁睿 发表于 2024-12-26 01:31:58

SpringBoot 整合WebService

WebService

   Web服务(Web Services)是一种基于网络的尺度化的软件系统,答应差别的应用程序通过网络相互通讯和交互。它们使用尺度化的网络协媾和数据格式,使得差别平台、差别语言编写的应用程序能够相互通讯和互换数据。
在现代软件开辟中,构建可靠的Web服务是至关重要的。Apache CXF是一个功能强大的Java框架,用于构建Web服务和Web应用程序。结合Spring Boot,我们可以快速搭建一个简单的WebService。本文将先容怎样使用Apache CXF和Spring Boot创建一个简单的WebService,并进行基本的测试。
1.简单先容WebService

1.1. 范例

Web服务通常分为两种重要范例:


[*]SOAP Web服务:基于SOAP(Simple Object Access Protocol)协议的Web服务。SOAP是一种用于互换结构化信息的协议,它使用XML作为消息格式,并通常通过HTTP协议进行传输。
[*]RESTful Web服务:基于REST(Representational State Transfer)原则的Web服务。RESTful服务使用尺度的HTTP方法(如GET、POST、PUT、DELETE)来执行操作,并通常返回JSON或XML格式的数据。
1.2. 架构

Web服务的架构通常包括以下关键组件:


[*]服务提供者(Service Provider):提供Web服务的实体。它们发布服务并处理来自客户端的请求。
[*]服务请求者(Service Requestor):使用Web服务的客户端应用程序。它们向服务提供者发送请求并处理相应。
[*]服务描述(Service Description):Web服务的描述文件,通常使用WSDL(Web Services Description Language)或OpenAPI等格式来描述服务的接口和操作。
[*]消息格式(Message Format):Web服务使用的数据互换格式,通常是XML或JSON。
[*]通讯协议(Communication Protocol):Web服务之间通讯的协议,常见的包括HTTP、HTTPS、SMTP等。
1.3. 重要特点

Web服务具有以下重要特点:


[*]跨平台性(Platform Independence):由于Web服务使用尺度化的协媾和数据格式,因此它们可以在差别的平台和操作系统上运行。
[*]松耦合(Loose Coupling):Web服务通过尺度化接口进行通讯,服务提供者和请求者之间的耦合度较低,可以独立开辟和部署。
[*]可组合性(Composability):可以通过组合多个Web服务来创建复杂的应用程序。
[*]可重用性(Reusability):Web服务可以被多个应用程序重复使用,从而提高了软件开辟服从。
[*]易于维护(Maintainability):由于Web服务使用尺度化的接口和协议,因此易于维护和更新。
1.4. 使用场景

Web服务在很多场景下都得到了广泛应用,包括但不限于:


[*]企业应用集成(Enterprise Application Integration,EAI):将差别的企业应用程序和系统集成在一起,实现数据和业务流程的无缝交互。
[*]分布式系统:构建分布式系统和服务导向架构(Service-Oriented Architecture,SOA),提供跨网络的服务和资源共享。
[*]移动应用程序开辟:通过Web服务为移动应用程序提供数据和功能支持,与后端服务器进行通讯和交互。
[*]云盘算:在云平台上部署和管理Web服务,提供云端服务和资源。
1.5. Web服务尺度和技术

一些常见的Web服务尺度和技术包括:


[*]SOAP(Simple Object Access Protocol):用于构建基于XML的Web服务的协议。
[*]WSDL(Web Services Description Language):用于描述Web服务的接口和操作的XML格式的语言。
[*]UDDI(Universal Description, Discovery, and Integration):用于注册和发现Web服务的协媾和规范。
[*]REST(Representational State Transfer):一种基于HTTP协议的软件架构风格,用于构建RESTful Web服务。
[*]JSON(JavaScript Object Notation):一种轻量级的数据互换格式,通常用于RESTful Web服务的数据格式。
2.案例-WebServiceDemo

2.1.引入配置文件

   首先,我们需要在项目中添加必要的依赖项。这些依赖项将资助我们集成Apache CXF到Spring Boot应用程序中。我的使用的是gradle构建的项目
    // 引入WebService
    implementation 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.0'
    implementation 'org.apache.cxf:cxf-rt-transports-http:3.2.0'
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.2.0</version>
</dependency>

2.2.创建接口

import com.fhr.student.entity.Student;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface StudentService {
    /**
   * 根据姓名获取学生信息
   * @param userName 学生姓名
   * @return 学生信息
   */
    Student getStudentInfoByName(@WebParam(name = "userName")String userName);
}

2.3.创建接口实现类

import com.fhr.service.StudentService;
import com.fhr.student.entity.Student;
import org.springframework.stereotype.Component;

import javax.jws.WebService;

/**
* targetNamespace:目标命名控件,一般由接口所在包路径命名,不过是由里往外写:比如:我接口所在路径为:com.fhr.service 写为:http://service.fhr.com/
*/
@Component
@WebService(targetNamespace = "http://service.fhr.com/",endpointInterface = "com.fhr.service.StudentService")
public class StudentImpl implements StudentService {
    /**
   * 根据学生姓名获取学生信息
   * @param userName 学生姓名
   * @return 学生信息
   */
    @Override
    public Student getStudentInfoByName(String userName) {
      // TODO这里应该查询数据库
      System.out.println("传入的参数为:"+userName);
      Student student = new Student();
      student.setUserName(userName);
      student.setClassName("高三一班");
      student.setAge(14);
      return student;
    }
}

2.4.创建WebService配置类

   我们需要配置CXF和发布WebService的端点。我们使用Spring Boot的配置类来完成这个任务。
import com.fhr.service.StudentService;
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;

@Configuration
public class WebServiceConfig {
   
    // 创建一个SpringBus Bean,作为Apache CXF的默认总线
    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
      return new SpringBus();
    }

    // 注册CXF Servlet,用于处理WebService请求
    @Bean(name = "wbsBean")
    public ServletRegistrationBean dispatcherServlet() {
      // 创建一个ServletRegistrationBean,将CXFServlet映射到指定路径
      ServletRegistrationBean wbsServlet = new ServletRegistrationBean(new CXFServlet(), "/wbs/*");
      return wbsServlet;
    }

    // 定义WebService端点
    @Bean
    public Endpoint endpointPurchase(SpringBus springBus, StudentService studentService) {
      // 创建EndpointImpl对象,并将SpringBus和WebService实现类传入
      EndpointImpl endpoint = new EndpointImpl(springBus, studentService);
      // 将端点发布到指定路径
      endpoint.publish("/user-server");
      // 打印发布成功消息,显示服务的访问地址
      System.out.println("服务发布成功!地址为:http://localhost:8081/wbs/user-server");
      // 返回端点对象
      return endpoint;
    }
}

2.5.测试

   启动项目后,您可以在欣赏器中输入http://localhost:8081/wbs/user-server?wsdl来查看WebService的WSDL文档。
# 启动项目
        在浏览器的地址中输入 http://localhost:8081/wbs/user-server?wsdl
https://i-blog.csdnimg.cn/blog_migrate/68e4fa689a064f688fe0f48688c2938a.png
# 测试客户端
        为了方便直接在本地项目测试
        在浏览器中输入 测试
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/stu")
public class StudentController {

    // 定义了一个映射到路径"/stu/getUserInfoByName"的GET请求处理方法
    @GetMapping("/getUserInfoByName")
    public Object[] getUserInfoByName(@RequestParam("name")String name){
      // 创建JaxWsDynamicClientFactory实例,用于动态创建客户端
      JaxWsDynamicClientFactory proxyFactoryBean =JaxWsDynamicClientFactory.newInstance();
      // 使用动态客户端工厂创建客户端对象,并指定WebService的WSDL地址
      Client client = proxyFactoryBean.createClient("http://localhost:8081/wbs/user-server?wsdl");
      // 定义一个Object数组用于存储调用WebService方法后的返回结果
      Object[] objects = new Object;
      
      // 调用远程WebService方法
      try {
            // 调用客户端的invoke方法,传入方法名和参数,获取WebService方法的返回结果
            objects = client.invoke("getStudentInfoByName", name);
      } catch (Exception e) {
            // 捕获异常,打印异常信息
            e.printStackTrace();
      }
      // 返回WebService方法的返回结果
      return objects;
    }
}


https://i-blog.csdnimg.cn/blog_migrate/2db36bcc78682e8353d80c3b8ffe35e7.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SpringBoot 整合WebService