草庐IT

【三】SpringBoot开发WebService接口

小北m 2023-04-21 原文

SpringBoot开发WebService接口

一、服务端开发

1、引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.6</version>
        </dependency>

2、创建接口BlogService

package com.webserver.myb.service;

import org.springframework.stereotype.Component;

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

/**
 * @Author mengyb
 * @description TODO
 * @Date 2023/1/28 10:12
 * @Version 1.0
 */
@WebService(name = "MybBlog",  // 与接口中指定的name一致
targetNamespace = "http://blogService.service.myb.blog.com", // 与接口中的命名空间一致,一般是接口的包名倒
)
public interface BlogService {

    @WebMethod
    public String send(@WebParam(name = "username") String username);

    @WebMethod
    public String message(@WebParam(name = "message") String message);

}

3、实现BlogService 接口

package com.webserver.myb.service.imppl;

import com.webserver.myb.service.BlogService;
import org.springframework.stereotype.Component;

import javax.jws.WebService;

/**
 * @Author mengyb
 * @description TODO
 * @Date 2023/1/28 10:15
 * @Version 1.0
 */
@Component
@WebService(name = "MybBlog",  // 与接口中指定的name一致
targetNamespace = "http://blogService.service.myb.blog.com", // 与接口中的命名空间一致,一般是接口的包名倒
        endpointInterface = "com.webserver.myb.service.BlogService"// 接口地址
)
public class BlogServiceImpl implements BlogService {
    @Override
    public String send(String username) {
        if ("zhangsan".equals(username)) {
            return "张三";
        }
        return "李四,王五";
    }

    @Override
    public String message(String message) {
        return "====Hello ====WebServer===" + message;
    }
}

4、创建WebService配置文件

package com.webserver.myb.config;

import com.webserver.myb.service.BlogService;
import com.webserver.myb.service.imppl.BlogServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

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;
/**
 * @Author mengyb
 * @description TODO
 * @Date 2023/1/28 10:17
 * @Version 1.0
 */
@Configuration
public class CxfConfig {

    @Autowired
    private BlogService blogService;

    @Bean
    public ServletRegistrationBean disServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/webService/*");
        return servletRegistrationBean;
    }
    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), blogService);
        endpoint.publish("/ws/api");
        return endpoint;
    }
}

5、启动项目

访问url: http://localhost:8080/webService?wsdl

访问url: http://localhost:8080/webService/ws/api?wsdl

【注】以上可以看到接口的相关信息,表示接口发布成功。

二、开发WebService客户端

1、导入依赖

  <!-- 进行jaxes 服务开发 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.0.1</version>
        </dependency>

2、生成客户端代码

2.1、使用idea在命令窗口,在指定的目录下使用命令:

(生成客户端代码方式不唯一,看个人喜好)

// wsimport命令是jdk提供的,作用是根据使用说明书生成客户端代码,wsimport只支持SOAP1.1客户端的生成
wsimport -keep -extension http://localhost:8080/webService/ws/api?wsdl

wsimport常用参数
-d:默认参数,用于生成.class文件
-s:生成.java文件
-p:指定生成java文件的包名,不指定则为WSDL说明书中namespace值得倒写

如下图所示

3、测试客户端

3.1、第一种方法

public static void main(String[] args) throws MalformedURLException {
        BlogServiceImplService service = new BlogServiceImplService();
        MybBlog mybBlogPort = service.getMybBlogPort();
        String message = mybBlogPort.message("你好啊,2023年");
        System.out.println("当前接受到的信息为----" + message);

        String lisi = mybBlogPort.send("lisi");
        System.out.println(lisi);
    }

3.2、第二种方法

封装客户端请求ClientUtil

package com.webserver.customer.utils;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

/**
 * @Author mengyb
 * @description TODO
 * @Date 2023/1/28 11:08
 * @Version 1.0
 */
public class ClientUtil {

    public static String callWebSV(String url, String methodName, String... params) throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(url);
        Object[] objects;
        // invoke("方法名",参数1,参数2,参数3....);
        objects = client.invoke(methodName, params);
        return objects[0].toString();
    }
}

测试方法

    public static void main(String[] args) {
        System.out.println("======开始调用webservice接口=====");
        String url = "http://localhost:8080/webService/ws/api?wsdl";
        String methodName = "send";
        String result="";
        try {
            result= ClientUtil.callWebSV(url, methodName, "lisi");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("结果集为---" + result);
    }

三、说明

1、对接口的wsdl文档解析

一个WSDL文档通常包含8个重要的元素,即definitions、types、import、message、portType、operation、binding、service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。

WSDL 服务进行交互的基本元素: Types(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD)。
Message(消息):通信数据的抽象类型化定义,它由一个或者多个 part 组成。 Part:消息参数
PortType(端口类型):特定端口类型的具体协议和数据格式规范。,它由一个或者多个 Operation组成。
Operation(操作):对服务所支持的操作进行抽象描述,WSDL定义了四种操作:
1.单向(one-way):端点接受信息;
3.要求-响应(solicit-response):端点发送消息,然后接受相关消息;
4.通知(notification[2] ):端点发送消息。

Binding:特定端口类型的具体协议和数据格式规范。
Port:定义为绑定和网络地址组合的单个端点。
Service:相关端口的集合,包括其关联的接口、操作、消息等。
外层结构里面也可能有多层结构。

2、Types

types元素作为一个容器,用于定义xml模式内置类型中没有描述的各种数据类型。当声明消息部分的有效时,消息定义使用了types元素中定义的数据类型和元素。

例如上面的例子:

    该部分定义了两个元素,send和sendResponse

    send:定义了一个复杂类型,用于操作的参数传入。并指明了参数的数据类型。

    sendResponse:定义了一个复杂类型,包含了一个简单的字符串,用于描述操作的返回值,并指明返回结果数据类型。

3、import

import元素可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的元素。
通常用于模块化WSDL文档。
必须有namespace属性和location属性:
1.namespace属性:值必须与正导入的WSDL文档中生命的targetNameSpace相匹配。
2.location属性:必须执行一个实际的WSDL文档,并且该文档不能为空

4、message

message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载。还可以描述SOAP文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。
在文本中的message元素的定义,本文档使用了采用文档样式的消息传递:

5、portType

portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中,portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案、以及Internet地址。

6、binding

binding元素将portType映射到一组具体协议(SOAP和HTTP),消息传递样式、编码样式。通常binding元素与协议转悠的元素和在一起使用。

7、service 和 port

service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding,甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。

【注】未完持续更新。。。。。。

有关【三】SpringBoot开发WebService接口的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

随机推荐