iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot整合WebService的实现示例
  • 459
分享到

SpringBoot整合WebService的实现示例

2024-04-02 19:04:59 459人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot搭建WEBService程序一、定义规范接口二、搭建WebService服务端三、搭建WebService客户端WebService是一种传统的SOA技术架构

WebService是一种传统的SOA技术架构,它不依赖于任何的编程语言,也不依赖于任何的技术平台,可以直接基于Http协议实现网络应用间的数据交互。

面向服务架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

在这里插入图片描述

WebService主要用于异构平台之间的整合与调用,例如请求者使用的是Java语言开发,而提供者是golang语言开发。使用XML进行接口的描述(SOAP协议)。

springBoot搭建WebService程序

在springboot-webservice项目中新建3个模块,webservice-server、webservice-client、webservice-common。

在这里插入图片描述

webservice-common项目引入项目依赖,webservice-server和webservice-client项目引入webservice-common项目。

在这里插入图片描述


<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.5</version>
    <type>pom</type>
</dependency>

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>7.0.1.Final</version>
</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</artifactId>
    <version>3.4.3</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
    <version>2.6.0</version>
</dependency>

一、定义规范接口

WebService服务端以远程接口为主,在Java实现的WebService技术中,使用CXF开发框架可以直接将接口发布成WebService。

webservice-common模块在com.it.service包下新建MessageService接口。


package com.it.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(name = "MessageService", targetNamespace = "http://service.it.com/")
public interface MessageService {
    @WebMethod // webservice方法标注
    String echo(@WebParam String message);
}

二、搭建WebService服务端

webservice-server模块定义MessageService的实现子类。


package com.it.service.impl;

import com.it.service.MessageService;
import org.springframework.stereotype.Service;

import javax.jws.WebService;

@WebService(serviceName = "MessageService",
        targetNamespace = "http://service.it.com/", // 接口命名空间
        endpointInterface = "com.it.service.MessageService") // 接口名称
@Service // 注册到Spring容器
public class MessageServiceImpl implements MessageService {
    @Override
    public String echo(String message) {
        return "[echo]: " + message;
    }
}

基于拦截器实现安全配置。


package com.it.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;
import org.w3c.dom.nodeList;

import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import java.util.Objects;

@Slf4j
@Component
public class WebServiceAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    private static final String USER_NAME = "admin"; // 用户名
    private static final String USER_PASSWord = "123456"; //密码
    private final SAAJInInterceptor interceptor = new SAAJInInterceptor(); // 创建拦截器

    public WebServiceAuthInterceptor() {
        super(Phase.PRE_PROTOCOL);
        super.getAfter().add(SAAJInInterceptor.class.getName()); // 添加拦截器
    }


    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        // 获取指定信息
        SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
        if (soapMessage == null) { // 没有消息
            this.interceptor.handleMessage(message); // 走默认流程
            soapMessage = message.getContent(SOAPMessage.class); // 再次获取消息
        }
        SOAPHeader header = null; // SOAP头信息
        try {
            header = soapMessage.getSOAPHeader();
        } catch (SOAPException e) {
            e.printStackTrace();
        }
        if (header == null) { // 没有头信息
            throw new Fault(new IllegalAccessException("找不到header信息"));
        }
        // 解析XML文档(SOAP是XML结构的)
        NodeList usernameList = header.getElementsByTagName("username");
        NodeList passwordList = header.getElementsByTagName("password");
        if (usernameList.getLength() < 1) {
            throw new Fault(new IllegalAccessException("找不到header信息"));
        }
        if (passwordList.getLength() < 1) {
            throw new Fault(new IllegalAccessException("找不到header信息"));
        }
        String username = usernameList.item(0).getTextContent().trim(); // 获取用户名
        String password = passwordList.item(0).getTextContent().trim(); // 获取密码

        if (Objects.equals(USER_NAME, username) && Objects.equals(USER_PASSWORD, password)) {
            log.info("用户访问成功");
        } else {
            SOAPException soapException = new SOAPException("用户认证失败");
            log.error("用户认证失败");
            throw new Fault(soapException);
        }
    }
}

由于当前的webservice是基于CXF开发的,所以需要定义CXF配置类。


package com.it.config;

import com.it.interceptor.WebServiceAuthInterceptor;
import com.it.service.MessageService;
import org.apache.cxf.Bus;
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;

@Configuration
public class CXFConfig {

    private final Bus bus;
    private final MessageService messageService;
    private final WebServiceAuthInterceptor webServiceAuthInterceptor;

    @Autowired
    public CXFConfig(Bus bus, MessageService messageService, WebServiceAuthInterceptor webServiceAuthInterceptor) {
        this.bus = bus;
        this.messageService = messageService;
        this.webServiceAuthInterceptor = webServiceAuthInterceptor;
    }

    public ServletRegistrationBean getServletRegistrationBean() {
        return new ServletRegistrationBean(new CXFServlet(), "/services/*"); // 设置webservice访问父路径
    }

    @Bean
    public Endpoint getMessageEndpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, messageService);
        endpoint.publish("/MessageService");
        endpoint.getInInterceptors().add(webServiceAuthInterceptor); // 添加拦截器
        return endpoint;
    }
}

新建SpringBoot启动类,启动程序。


package com.it;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StartWebServiceServer {
    public static void main(String[] args) {
        SpringApplication.run(StartWebServiceServer.class, args);
    }
}

浏览器访问:http://localhost:8080/services 发现webservice发布成功。

在这里插入图片描述

WSDL文档也正常出现。

在这里插入图片描述

三、搭建WebService客户端

CXF组件下的WebService调用服务使用如下流程:

在这里插入图片描述

webservice-client模块创建客户端登录拦截器,设置认证信息。


package com.it.interceptor;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.List;

public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    private final String username;
    private final String password;

    public ClientLoginInterceptor(String username, String password) {
        super(Phase.PRE_PROTOCOL);
        this.username = username;
        this.password = password;
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders(); // 获取全部头信息
        Document document = DOMUtils.createDocument(); // 创建xml文档
        Element authElement = document.createElement("authority"); // 认证数据节点
        Element usernameElement = document.createElement("username");
        Element passwordElement = document.createElement("password");
        usernameElement.setTextContent(username);
        passwordElement.setTextContent(password);
        authElement.appendChild(usernameElement);
        authElement.appendChild(passwordElement);
        headers.add(0, new Header(new QName("authority"), authElement));
    }
}

CXF有两种调用方式,代理调用和动态程序调用。使用代理调用:


package com.it.client;

import com.it.interceptor.ClientLoginInterceptor;
import com.it.service.MessageService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class CXFProxyClient {
    private static final String ADDRESS = "http://localhost:8080/services/MessageService?wsdl"; // WebService服务地址

    public static void main(String[] args) {
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.setAddress(ADDRESS);
        jaxWsProxyFactoryBean.setServiceClass(MessageService.class);
        jaxWsProxyFactoryBean.getOutInterceptors().add(
                new ClientLoginInterceptor("admin","123456") // 设置用户名,密码
        );
        MessageService messageService = (MessageService)jaxWsProxyFactoryBean.create();
        String echo = messageService.echo("[webservice proxy invoke]");
        System.out.println("echo = " + echo);
    }

}

执行程序,接口调用成功。

加粗样式

动态调用:


package com.it.client;

import com.it.interceptor.ClientLoginInterceptor;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class CXFDynamicClient {
    private static final String ADDRESS = "http://localhost:8080/services/MessageService?wsdl"; // WebService服务地址

    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(ADDRESS);
        client.getOutInterceptors().add(new ClientLoginInterceptor("admin","123456"));
        String message = "dynamic";
        Object[] result = client.invoke("echo", message);
        System.out.println(result);
    }
} 

到此这篇关于SpringBoot整合WebService的实现示例的文章就介绍到这了,更多相关SpringBoot整合WebService内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot整合WebService的实现示例

本文链接: https://www.lsjlt.com/news/158755.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot整合WebService的实现示例
    目录SpringBoot搭建WebService程序一、定义规范接口二、搭建WebService服务端三、搭建WebService客户端WebService是一种传统的SOA技术架构...
    99+
    2024-04-02
  • Springboot整合FreeMarker的实现示例
    目录一、项目搭建1、新建模块2、导入依赖 :将不相关的依赖删掉3、新建软件包,放入student实体类4、新建StudentMapper接口5、Springboot04Applica...
    99+
    2024-04-02
  • SpringBoot整合Pulsar的实现示例
    目录一、添加pom.xml依赖二、Pulsar 参数类三、Pulsar 配置类四、不同消费数据类型的监听器五、Pulsar的核心服务类六、Pulsar整合Spring Cloud一、...
    99+
    2024-04-02
  • springboot 整合 clickhouse的实现示例
    目录前言前置准备使用jdbc方式操作clickhouse与springboot的整合代码完整整合步骤前言 了解了clickhouse的基础概念和相关的理论之后,本篇将通过实例代码演示...
    99+
    2024-04-02
  • SpringBoot整合JWT的实现示例
    目录一. JWT简介二. Java实现JWT(SpringBoot方式整合)JWT总结一. JWT简介 1. 什么是JWT? JWT(JSON Web Token)是为了在...
    99+
    2024-04-02
  • SpringBoot整合Redis的实现示例
    目录1.需求说明2.整合实现2.1.创建Springboot工程2.2.redis配置3.编写测试类4.注意事项和细节1.需求说明 在 springboot 中 , 整合 redis...
    99+
    2023-01-28
    SpringBoot整合Redis SpringBoot Redis整合
  • SpringBoot整合WebService服务的实现代码
    目录为什么使用WebService?适用场景: 不适用场景:Axis2与CXF的区别SpringBoot使用CXF集成WebServiceWebService是一个SOA(...
    99+
    2024-04-02
  • springboot整合spring-retry的实现示例
    目录1、背景2、解决方案2.1 pom文件2.2 applicat启动类2.3 controller类2.4 service测试类(重点)2.5 项目启动2.6 使用swagger进...
    99+
    2024-04-02
  • springboot 整合canal实现示例解析
    目录前言环境准备一、快速搭建canal服务搭建步骤1、服务器使用docker快速安装一个mysql并开启binlog日志2、上传canal安装包并解压3、进入到第二步解压后的文件目录...
    99+
    2024-04-02
  • SpringBoot整合Netty实现WebSocket的示例代码
    目录一、pom.xml依赖配置二、代码2.1、NettyServer 类2.2、SocketHandler 类2.3、ChannelHandlerPool 类2.4、Applicat...
    99+
    2024-04-02
  • SpringBoot整合MybatisPlus实现基本CRUD的示例代码
    目录一、引入相应的依赖二、进行配置三、新建数据库表四、配置 Mybatis Plus 自动填充五、实现User实体类、UserMapper、UserService六、使用Restfu...
    99+
    2023-05-19
    SpringBoot MybatisPlus实现CRUD SpringBoot MybatisPlus CRUD
  • SpringBoot整合Mybatis Plus多数据源的实现示例
    目录导读添加依赖application.properties 2种方式创建DataSource Master配置,使用druid连接池 Slave配置 启动类演示导读   有一个这样...
    99+
    2024-04-02
  • SpringBoot整合aws的示例代码
    业务需求 将本地的一些文件保存到aws上 引入依赖 创建client 工具类 引入依赖 <dependency> ...
    99+
    2024-04-02
  • SpringBoot整合Liquibase的示例代码
    目录整合1整合2SpringBoot整合Liquibase虽然不难但坑还是有一点的,主要集中在配置路径相关的地方,在此记录一下整合的步骤,方便以后自己再做整合时少走弯路,当然也希望能...
    99+
    2024-04-02
  • SpringBoot整合ElasticSearch的示例代码
    ElasticSearch作为基于Lucene的搜索服务器,既可以作为一个独立的服务部署,也可以签入Web应用中。SpringBoot作为Spring家族的全新框架,使得使用SpringBoot开发Spring应用变得非常简单。本文要介绍如...
    99+
    2023-05-31
    spring boot elasticsearch
  • SpringBoot整合MyBatis的示例分析
    这篇文章主要介绍了SpringBoot整合MyBatis的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.整合MyBatis操作前面一篇提到了SpringBoot整...
    99+
    2023-06-15
  • SpringBoot整合MybatisPlus的示例分析
    这篇文章给大家分享的是有关SpringBoot整合MybatisPlus的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建个SpringBoot项目勾选生所需的依赖:我把application的后缀改为...
    99+
    2023-06-20
  • SpringBoot整合SpringDataRedis的示例代码
      本文介绍下SpringBoot如何整合SpringDataRedis框架的,SpringDataRedis具体的内容在前面已经介绍过了,可自行参考。 1....
    99+
    2024-04-02
  • SpringBoot整合logback的示例代码
    Logback简介 1、logback和log4j是同一个作者,logback可以看作是log4j的升级版 2、logback分为三个模块, logback-core, logbac...
    99+
    2024-04-02
  • SpringBoot整合ShardingSphere的示例代码
    目录一、相关依赖二、Nacos数据源配置三、项目配置四、验证概要: ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、S...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作