我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot调用第三方WebService接口的两种实现方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot调用第三方WebService接口的两种实现方式

WebService简介

WebService接口的发布通常一般都是使用WSDL(web service descriptive language)文件的样式来发布的,该文档包含了请求的参数信息,返回的结果信息,我们需要根据WSDL文档的信息来编写相关的代码进行调用WebService接口。接下来我将采用常见的两种方式调用WebService接口。


场景描述

目前我需要使用java调用C#系统的一个WebService接口,传递参数为一个表号,返回的是一个Xml的数据类型,需要实现调用接口,获取到xml之后并解析为Json格式数据,并返回给前端。Java调用WebService接口,需要根据提供接口方的XSD文档编写相关代码,Xsd文档可以直接通过提供的接口地址进行查看。


WebServiceTemplate调用WebService接口实现

导入相关的依赖包,如下:

              org.springframework.boot            spring-boot-starter-web-services  

使用WebServiceTemplate实现调用WebService接口,需要编写先关的解析类,根据提供的XSDL文档编写先关代码,XSDL文档信息如下:

POST /rootServiceFlow/EBoardService.asmx HTTP/1.1Host: 10.200.0.74Content-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://tempuri.org/AAFlow002x"         string    

上面的信息是包含请求所需要传递的参数,字段为LotNo。接下来XSDL的文档信息为返回的数据格式,如下:

HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length            string      

需要根据以上信息编写请求类AAFlow002x,响应接收解析类AAFlow002xResponse,和ObjectFactory类,这三个类可以使用Idea的终端通过命令的方式生成对应的java类,也可以通过自己编写生成java类。通过命令的方式如下:

xjc -d /path/to/output http://example.com/sample.xsd

/path/to/output为生成类的目录,http://example.com/sample.xsd为webServce的接口地址,生成的类如下:

AAFlow002x类编写如下:import lombok.Data;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "",  propOrder = {        "LotNo"})@XmlRootElement(name = "AAFlow002x", namespace = "http://tempuri.org/")@Datapublic class AAFlow002x {    @XmlElement(name = "LotNo", namespace = "http://tempuri.org/", required = true)    protected String LotNo;}
AAFlow002xResponse类编写如下:import lombok.Data;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "AAFlow002xResponse", namespace = "http://tempuri.org/", propOrder = {        "AAFlow002xResult"})@XmlRootElement(name = "AAFlow002xResponse")@Datapublic class AAFlow002xResponse {    @XmlElement(name = "AAFlow002xResult", namespace = "http://tempuri.org/", required = true)    private String AAFlow002xResult;}
ObjectFatoty类编写如下:import javax.xml.bind.JAXBElement;import javax.xml.bind.annotation.XmlElementDecl;import javax.xml.bind.annotation.XmlRegistry;import javax.xml.namespace.QName;@XmlRegistrypublic class ObjectFactory {    private final static QName _AAFlow002_QNAME = new QName("http://tempuri.org/", "AAFlow002x");    private final static QName _AAFlow002Response_QNAME = new QName("http://tempuri.org/", "AAFlow002xResponse");    public ObjectFactory() {    }    public AAFlow002x createAAFlow002x() {        return new AAFlow002x();    }    public AAFlow002xResponse createAAFlow002xResponse() {        return new AAFlow002xResponse();    }    @XmlElementDecl(namespace = "http://tempuri.org/", name = "AAFlow002x")    public JAXBElement createAAFlow002x(AAFlow002x value) {        return new JAXBElement(_AAFlow002_QNAME, AAFlow002x.class, null, value);    }    @XmlElementDecl(namespace = "http://tempuri.org/", name = "AAFlow002yResponse")    public JAXBElement createAAFlow002yResponse(AAFlow002xResponse value) {        return new JAXBElement(_AAFlow002Response_QNAME, AAFlow002xResponse.class, null, value);    }}

编写使用WebServiceTemplate进行调用

@Service@Slf4jpublic class TestWebService {     private static final String ENDPOINT_URL = "这里填写你调用的WebService接口地址";    private static final String SOAP_ACTION = "http://tempuri.org/AAFlow002x";        public  String  getDataTable(String LotNo) {         //         创建WebServiceTemplate对象        WebServiceTemplate webServiceTemplate = new WebServiceTemplate();        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();        // 设置解析类,这里填写包的路径为AAFlow002xResponse类所在路径        marshaller.setContextPath("org.test.parse");        webServiceTemplate.setMarshaller(marshaller);        webServiceTemplate.setUnmarshaller(marshaller);        // 封装请求参数        AAFlow002x aaFlow002 = new ObjectFactory().createAAFlow002x();        aaFlow002.setLotNo("22113102");        // 创建SOAP请求回调对象,这里的SOAP_ACTION指定你调用的接口的哪个方法        SoapActionCallback soapActionCallback = new SoapActionCallback(SOAP_ACTION);        // 调用WebService接口,发送请求并返回数据        JAXBElement aaFlow002xResponse = (JAXBElement) webServiceTemplate.marshalSendAndReceive(ENDPOINT_URL, aaFlow002, soapActionCallback);        String result = aaFlow002xResponse.getValue().getAAFlow002xResult();        // 输出响应结果        System.out.println(aaFlow002xResponse.getValue().getAAFlow002xResult());        return result;         }    }

编写完成之后,Debug启动项目。出现如下图所示证明调用接口成功:
在这里插入图片描述

我们可以针对以上代码进行优化,写一个WebServiceConfig类,专门对WebServiceTemplate进行配置,这里就不在赘述。
采用WebServiceTemplate接口调用WebService接口,虽然可以采用命令的方式生成对应的Java代码,但是其缺点是如果请求的参数和返回的参数数据结构很复杂,生成的java类代码就很复杂。


HttpClientBuilder调用WebService接口实现

  @Override    public JSONObject getDataFromMESSystem(String deviceNumber)  {       // 根据上面的XSDL文档封装请求参数       String strParameter = "\n" +               "\n" +               "  \n" +               "    \n" +               "  " + deviceNumber + "\n" +               "    \n" +               "   \n" +               " ";        // 获取数据,返回的是一个xml格式数据        String xmlData = doPostSoap(UrlConstant.MES_SERVICE_URL, strParameter, UrlConstant.MES_SOAP_URI);        JSONObject jsonObject = null;        try {            // 将请求结果转换成json类型            if(StringUtils.isNotBlank(xmlData)){                jsonObject = xml2Json(xmlData);            }        } catch (Exception e) {            e.printStackTrace();        }        return jsonObject;    }    public static String doPostSoap(String url, String soap, String SOAPAction) {        // 请求体        String retStr = "";        // 创建HttpClientBuilder        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();        // HttpClient        CloseableHttpClient closeableHttpClient = httpClientBuilder.build();        HttpPost httpPost = new HttpPost(url);        try {            httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");            httpPost.setHeader("SOAPAction", SOAPAction);            StringEntity data = new StringEntity(soap,                    Charset.forName("UTF-8"));            httpPost.setEntity(data);            CloseableHttpResponse response = closeableHttpClient                    .execute(httpPost);            HttpEntity httpEntity = response.getEntity();            if (httpEntity != null) {                // 打印响应内容                retStr = EntityUtils.toString(httpEntity, "UTF-8");                System.err.println("response:" + retStr);            }            // 释放资源            closeableHttpClient.close();        } catch (Exception e) {            e.printStackTrace();        }        return retStr;    }

接下来需要根据返回的xml格式数据解析为Json格式,我们可以用Postman测试WebService接口,查看数据返回格式,如下图所示:
在这里插入图片描述
点击Send,返回的数据格式如下图所示:
在这里插入图片描述
数据太多,这里我给出返回的缩减的结构数据,如下

                                                                                                                                                                                                                                                                                                   2596                                                                                    

根据上面的信息,编写解析xml数据转换为Json格式数据代码如下:

     public static JSONObject xml2Json(String xmlStr) throws DocumentException {        Document doc = DocumentHelper.parseText(xmlStr);        Element root = doc.getRootElement();        Element body = root.element("Body");        Element response = body.element("AAFlow002yResponse");        Element result = response.element("AAFlow002yResult");        Element diffgram = result.element(new QName("diffgram", Namespace.get("urn:schemas-microsoft-com:xml-diffgram-v1")));        Element documentElement = diffgram.element("DocumentElement");        Element aaFlow002 = documentElement.element("AAFlow002");        JSONObject jsonObject = new JSONObject();        Iterator iterator = aaFlow002.elementIterator();        while (iterator.hasNext()) {            Element element = iterator.next();            jsonObject.put(element.getName(), element.getText());        }        return jsonObject;    }

通过HttpClient的方式调用WebService接口,缺点是需要自己编写解析xml的代码,而WebServiceTemplate的方式可以自动解析为对应的Java类,但是个人更偏向于使用HttpClient的方式调用WebService接口,WebServiceTemplate方式,代码复杂度比较高,耦合性太强。

来源地址:https://blog.csdn.net/m0_37742400/article/details/130691229

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot调用第三方WebService接口的两种实现方式

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

下载Word文档

猜你喜欢

Java调用CXF WebService接口的两种方式实例

方式一:使用CXF提供的工具生成客户端代码。1. 在项目中添加CXF的依赖。2. 使用CXF提供的命令行工具生成客户端代码,命令如下:```wsdl2java -d -p ```其中,``为生成的代码存放的目录,``为生成的代码所在的包
2023-09-16

SpringBoot-RestTemplate实现调用第三方API的方式

RestTemplate 是由 Spring 提供的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute,下面看下SpringBoot RestTemplate调用第三方API的方式
2022-12-08

Java调用第三方http接口的方式总结(四种)

在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等) ①通过JDK网络类Java.net.HttpURLConn
2023-08-16

详解SpringBoot 调用外部接口的三种方式

SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程,这篇文章主要介绍了SpringBoot 调用外部接口的三种方式,需要的朋友可以参考下
2023-05-15

Java调用第三方接口封装实现

本文主要介绍了Java调用第三方接口封装实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-16

java异步调用第三方接口怎么实现

在Java中,可以使用多线程或使用异步框架来实现异步调用第三方接口。1. 使用多线程:可以创建一个新的线程来执行第三方接口的调用操作,这样可以让主线程继续执行其他任务而不需要等待第三方接口的返回结果。可以使用Java的Thread类或者Ex
2023-10-09

Springboot使用RestTemplate调用第三方接口的操作代码

这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码
2022-12-08

Springboot打印接口的三种方式分享

这篇文章主要为大家详细介绍了Springboot打印接口的三种方式:aop切面的方式、过滤器的方式和拦截器的方式,感兴趣的可以跟随小编一起学习一下
2022-11-13

python调用excel_vba的两种实现方式

本文主要介绍了python调用excel_vba的两种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-29

浅谈Java 三种方式实现接口校验

本文介绍了Java 三种方式实现接口校验,主要包括AOP,MVC拦截器,分享给大家,具体如下:方法一:AOP代码如下定义一个权限注解package com.thinkgem.jeesite.common.annotation; impor
2023-05-30

Python调用API接口的几种方式

Python调用API接口的几种方式主要有以下几种:1. 使用标准库:Python标准库中的urllib和urllib2模块可以用来发送HTTP请求,并获取API接口的响应数据。可以使用urllib.urlopen或urllib2.urlo
2023-09-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录