SpringBoot 整合WebService

news2024/9/21 21:47:33

文章目录

    • WebService
      • 1.简单介绍WebService
        • 1.1. 类型
        • 1.2. 架构
        • 1.3. 主要特点
        • 1.4. 使用场景
        • 1.5. Web服务标准和技术
      • 2.案例-WebServiceDemo
        • 2.1.引入配置文件
        • 2.2.创建接口
        • 2.3.创建接口实现类
        • 2.4.创建WebService配置类
        • 2.5.测试

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

image-20220509163821547

# 测试客户端 
	为了方便直接在本地项目测试
	在浏览器中输入 测试
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[0];
        
        // 调用远程WebService方法
        try {
            // 调用客户端的invoke方法,传入方法名和参数,获取WebService方法的返回结果
            objects = client.invoke("getStudentInfoByName", name);
        } catch (Exception e) {
            // 捕获异常,打印异常信息
            e.printStackTrace();
        }
        // 返回WebService方法的返回结果
        return objects;
    }
}


image-20220509164055806

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kotlin安卓开发教程视频,2024年Android开发陷入饱和

Android基础 1、什么是ANR 如何避免它&#xff1f; 如果耗时操作需要让用户等待&#xff0c;那么可以在界面上显示进度条。 2、View的绘制流程&#xff1b;自定义View如何考虑机型适配&#xff1b;自定义View的事件 3、分发机制&#xff1b;View和ViewGroup分别有哪些事件分…

蓝桥杯备战刷题three(自用)

1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…

在线ai写作,让你随时随地创作优质内容

如今的ai技术已经渗透到我们生活的方方面面。其中&#xff0c;AI写作成为了一个备受关注的领域。如今&#xff0c;我们可以利用在线ai写作在任何时间、任何地点创作出优质的内容。 传统的写作过程需要大量的时间和精力。从构思到写作再到修改&#xff0c;每一个环节都需要我们投…

C# 解决uploadify插件上传时造成session丢失问题

出现的问题&#xff1a; 在应用uploadify插件实现上传图片时&#xff0c;报了HTTP Error&#xff0c;经过在Network查看上传方法报错码是302&#xff0c;那这里就可以知道问题是什么了&#xff0c;HTTP 302是请求被重定向&#xff0c;如果你的uploadify处理上传方法有session验…

ABAP - OOALV 用户交互事件

当用户要根据ALV进行某些功能操作比如打印表单时&#xff0c;OOALV标准按钮无法满足用户需求的时候&#xff0c;就要用到自定义按钮来实现了。思路&#xff1a;在OOALV增加一个自定义按钮&#xff0c;类CL_GUI_ALV_GRID提供了内置事件toolbar来完成&#xff0c;通过自定义按钮的…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

HTTPS是什么,详解它的加密过程

目录 1.前言 2.两种加密解密方式 2.1对称加密 2.2非对称加密 3.HTTPS的加密过程 3.1针对明文的对称加密 3.2针对密钥的非对称加密 3.3证书的作用 1.前言 我们知道HTTP协议是超文本传输协议,它被广泛的应用在客户端服务器上,用来传输文字,图片,视频,js,html等.但是这种传…

MyBatis 学习(五)之 高级映射

目录 1 association 和 collection 介绍 2 案例分析 3 一对一关联和一对多关联 4 参考文档 1 association 和 collection 介绍 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 标签&#xff0c;这两个标签是用来关联查询的&#xff0c;它们的属…

指针与malloc动态内存申请,堆和栈的差异

定义了两个函数print_stack()和print_malloc()&#xff0c;分别演示了两种不同的内存分配方式&#xff1a;栈内存和堆内存。然后在main()函数中调用这两个函数&#xff0c;并将它们返回的指针打印出来。 由于print_stack()中的数组c是在栈上分配的&#xff0c;当函数返回后&…

LabVIEW非接触式电阻抗层析成像系统

LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像&#xff08;NEIT&#xff09;技术以其无辐射、非接触、响应速度快的特点&#xff0c;为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统&#xff0c;实现了数据的在线采集及实时成像&#xff0c;提高…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

力扣SQL50 无效的推文 查询

Problem: 1683. 无效的推文 思路 &#x1f468;‍&#x1f3eb; 参考 char_length(str)&#xff1a;计算 str 的字符长度length(str)&#xff1a;计算 str 的字节长度 Code select tweet_id from Tweets where char_length(content) > 15;

G8-ACGAN理论

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、对比分析 前面的文章介绍了CGAN&#xf…

面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种

HashMap的7种遍历方式 四大类遍历方式 其实在JDK1.8之前&#xff0c;遍历的方式远没有现在这样多&#xff0c;为了提高开发效率&#xff0c;JDK1.8开始引入了Stream流、Lambda 表达式等新特性&#xff0c;这让很多数据结构的遍历方式也丰富了起来。目前&#xff0c;常用的遍历方…

Node.js中的缓存策略和缓存技巧

在Node.js中&#xff0c;缓存策略和缓存技巧是提升应用性能和用户体验的关键因素。通过有效地利用缓存&#xff0c;我们可以显著减少系统资源的消耗&#xff0c;加快数据访问速度&#xff0c;从而提升整体的网站性能。本文将针对Node.js中的缓存策略和缓存技巧展开深入探讨&…

Windows下卸载JDK

操作步骤&#xff1a; 直接到windows程序卸载面板进行卸载 然后删除已配置的环境变量

TDengine 研发分享:利用 Windbg 解决内存泄漏问题的实践和经验

内存泄漏是一种常见的问题&#xff0c;它会导致程序的内存占用逐渐增加&#xff0c;最终导致系统资源耗尽或程序崩溃。AddressSanitizer (ASan) 和 Valgrind 是很好的内存检测工具&#xff0c;TDengine 的 CI 过程就使用了 ASan 。不过这次内存泄漏问题发生在 Windows 下&#…

设置matplotlib的style和rcParams

在matplotlib文档中&#xff0c;有3中设置matplot的方法&#xff0c;见文档 https://matplotlib.org/stable/users/explain/customizing.html 目前用得比较多的是设置rcParams&#xff0c;而设置rcParams也有两种方式。下面以 plot的cycler为例进行说明。 cycler就是定义的一些…

13.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-如果没有工具就创造工具

内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容 &#xff1a;12.游戏网络通信存在的问题 现在把游戏网络的架构看了一个小小的大概&#xff0c;可以用它的接口发数据接收数据了&#xff0c;如果真正想用它这一套东西&#xff0c;真正核心不在于它的接口而在于…

私域必备宝藏工具:多微信统一管理聚合聊天

对于私域流量运营者来说&#xff0c;如何高效管理多个微信号成为了一道难题。 不过不用担心&#xff0c;通过微信管理系统&#xff0c;可以实现多个微信同时登录&#xff0c;同一个界面内聚合聊天&#xff0c;省去来回切换账号的步骤。而且&#xff0c;还有很多非常实用且便捷…