Java 调用 WebService 、java调用Soap请求、Java对接soap接口

这篇具有很好参考价值的文章主要介绍了Java 调用 WebService 、java调用Soap请求、Java对接soap接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作第一次遇到对接soap接口,觉得有必要记录一下,毕竟踩了不少坑,网上帖子很多但大都不全,也不可能完全满足自己的需求,于是就有了下面的代码:

除了只是借鉴,

注意事项:1.http://ip:port/xxx/xxx/soap?wsdl有些soap接口,对面是不需要穿?wsdl对接时要问出清

2. httpPost.setHeader("SOAPAction", SOAPAction); SOAPAction也要问下,或者查看接口文件,有些只要传空字符串

3.拼接报文时要注意格式,/n一类的特殊符号不能有

4.xml解析式注意编号,编号可能存在编码来回切换returnDatabase = convertToUTF8(returnDatabase);文章来源地址https://www.toymoban.com/news/detail-755065.html

package com.ankang.hospital.utils;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
public class HttpClientUtil {

    private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);

    /**
     * HttpClient 调用 WebService
     *
     * @param wsUrl   webService地址,格式:http://ip:port/xxx/xxx/soap?wsdl
     * @param StrDate 格式的入参StrDate=2023/08/02
     * @return
     */
    public static String callServiceHC(String wsUrl, String StrDate) {
        String xml = createSoapContent(StrDate);
        String returnDatabase = doPostSoap(wsUrl, xml, "");//urn:hl7-org:v3/ZDYFWTYRK

        // 强制将返回结果转换为 UTF-8 编码
        returnDatabase = convertToUTF8(returnDatabase);

        return returnDatabase;
    }

    /**
     * 强制转换整utp-8
     * @param input
     * @return
     */
    public static String convertToUTF8(String input) {
        try {
            byte[] utf8Bytes = input.getBytes(StandardCharsets.UTF_8);
            return new String(utf8Bytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return input; // 返回原始字符串,如果转换失败
    }
    /**
     * 根据拼接 xml 字符串
     *
     * @param StrDate
     * @return
     */
    public static String createSoapContent(String StrDate) {
        log.info("开始拼接请求报文");
        //开始拼接请求报文
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:hl7-org:v3\">\n");
        stringBuilder.append("<soapenv:Header/>");
        stringBuilder.append("<soapenv:Body>");

        stringBuilder.append("<urn:ZDYFWTYRK>");
        stringBuilder.append("<urn:req>");
        //传参action
        stringBuilder.append("<urn:action>");
        stringBuilder.append("Z1901");
        stringBuilder.append("</urn:action>");
        //传参rdn
        stringBuilder.append("<urn:rdn>");
        stringBuilder.append("SSXWGYGXT");
        stringBuilder.append("</urn:rdn>");
        //传参message
        stringBuilder.append("<urn:message><![CDATA[");
        stringBuilder.append("<Request>");
        stringBuilder.append("<operDate>");
        stringBuilder.append(StrDate);
        stringBuilder.append("</operDate>");
        stringBuilder.append("<hoscode>");
        stringBuilder.append("A001");
        stringBuilder.append("</hoscode>");
        stringBuilder.append("</Request>");
        stringBuilder.append("]]></urn:message>");

        stringBuilder.append("</urn:req>");
        stringBuilder.append("</urn:ZDYFWTYRK>");

        stringBuilder.append("</soapenv:Body>");
        stringBuilder.append("</soapenv:Envelope>");

        logger.debug("拼接后的参数\n" + stringBuilder.toString());

        return stringBuilder.toString();
    }

    /**
     * HTTPClient 调用 WebService
     *
     * @param url
     * @param soap
     * @param SOAPAction
     * @return
     */
    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");
            }
            // 释放资源
            closeableHttpClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retStr;
    }


    public static String analyzeResult(String xmlContent) {
        try {
            // 从 xmlContent 字符串解析 XML
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true); // 启用命名空间感知
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(xmlContent)));

            // 获取根元素 (SOAP-ENV:Envelope)
            Element root = doc.getDocumentElement();

            // 获取 SOAP-ENV:Body 元素
            Element body = null;
            NodeList bodyList = root.getElementsByTagName("SOAP-ENV:Body");
            if (bodyList.getLength() > 0) {
                body = (Element) bodyList.item(0);
            }

            // 获取带有 'urn:hl7-org:v3' 命名空间的 ZDYFWTYRKResponse 元素
            Element zdyfwtyrkResponse = (Element) body.getElementsByTagNameNS("urn:hl7-org:v3", "ZDYFWTYRKResponse").item(0);

            Element zdyfwtyrkResult = (Element) zdyfwtyrkResponse.getElementsByTagNameNS("urn:hl7-org:v3", "ZDYFWTYRKResult").item(0);

            // 获取 ZDYFWTYRKResult 元素中的 CDATA 内容(实际的结果数据)
            String cdataContent = zdyfwtyrkResult.getTextContent();

            // 处理CDATA中的XML内容
            Document cdataDoc = builder.parse(new InputSource(new StringReader(cdataContent)));

            // 将Document转换为不带BOM的字符串
            String cdataXmlString = convertDocumentToStringWithoutBOM(cdataDoc);

            logger.debug("cdataXmlString结果: " + cdataXmlString);
            return cdataXmlString;
        } catch (ParserConfigurationException e) {
            // 记录异常信息到日志
            log.error("XML解析器配置错误: " + e.getMessage(), e);
        } catch (IOException e) {
            // 记录 IOException 异常信息到日志
            log.error("发生 IO 异常: " + e.getMessage(), e);
        } catch (SAXException e) {
            // 记录 SAXException 异常信息到日志
            log.error("SAX 解析异常: " + e.getMessage(), e);
        } catch (TransformerException e) {
            log.error("XML的转换、解析和转换错误: " + e.getMessage(), e);
        }

        return null;
    }

    /**
     * 将 DOM Document 转换为 UTF-8 无 BOM 格式的字符串。
     *
     * @param doc 要转换的 DOM Document。
     * @return 不带 BOM 的 UTF-8 字符串表示的文档。
     */
    private static String convertDocumentToStringWithoutBOM(Document doc) throws TransformerException, UnsupportedEncodingException {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();

        // 设置编码为 UTF-8 且不带 BOM
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // 省略 XML 声明
        transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 格式化输出

        // 创建一个 ByteArrayOutputStream 来保存 XML 内容
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        StreamResult result = new StreamResult(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));

        // 将 Document 转换为不带 BOM 的字符串
        transformer.transform(new DOMSource(doc), result);

        // 将 ByteArrayOutputStream 转换为字符串
        return outputStream.toString("UTF-8");
    }

    public static List<Map<String, String>> resultMap1(String soapResponse) {
        // 从soapResponse中提取JSON部分
        int startIndex = soapResponse.indexOf("<list>");
        int endIndex = soapResponse.indexOf("</list>");
        String jsonPart = soapResponse.substring(startIndex + "<list>".length(), endIndex);
        // 将JSON转换为Map
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Map<String, Object> resultMap = objectMapper.readValue(soapResponse, new TypeReference<Map<String, Object>>() {
            });
            ;
            List<Map<String, Object>> resultJsonList = (List<Map<String, Object>>) resultMap.get("resultJson");
            // 转换为 List<Map<String, String>>
            List<Map<String, String>> resultList = new ArrayList();
            for (Map<String, Object> item : resultJsonList) {
                Map<String, String> newMap = new HashMap();
                for (Map.Entry<String, Object> entry : item.entrySet()) {
                    String key = entry.getKey();
                    String value = entry.getValue().toString();
                    newMap.put(key, value);
                }
                // 添加resultCode和resultMsg到转换后的结果
                newMap.put("resultCode", resultMap.get("resultCode").toString());
                newMap.put("resultMsg", resultMap.get("resultMsg").toString());
                resultList.add(newMap);
            }

            // 输出转换后的结果
            for (Map<String, String> item : resultList) {
                System.out.println("resultCode: " + item.get("resultCode"));
                System.out.println("resultMsg: " + item.get("resultMsg"));
                System.out.println("patientName: " + item.get("patientName"));
                System.out.println("opername: " + item.get("opername"));
                System.out.println("operdate: " + item.get("operdate"));
                System.out.println("doctor: " + item.get("doctor"));
            }
            return resultList;
        } catch (IOException e) {
            // 异常处理
            e.printStackTrace();
        }
        return null;
    }

    public static List<Map<String, String>> resultMap(String soapResponse) {
        // 从soapResponse中提取JSON部分
        int startIndex = soapResponse.indexOf("<list>");
        int endIndex = soapResponse.indexOf("</list>");
        String jsonPart = soapResponse.substring(startIndex + "<list>".length(), endIndex);
        // 将JSON转换为Map
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Map<String, Object> resultMap = objectMapper.readValue(jsonPart, new TypeReference<Map<String, Object>>() {
            });
            List<Map<String, Object>> resultJsonList = (List<Map<String, Object>>) resultMap.get("resultJson");
            // 转换为 List<Map<String, String>>
            List<Map<String, String>> resultList = new ArrayList();
            for (Map<String, Object> item : resultJsonList) {
                Map<String, String> newMap = new HashMap();
                for (Map.Entry<String, Object> entry : item.entrySet()) {
                    String key = entry.getKey();
                    String value = entry.getValue().toString();
                    newMap.put(key, value);
                }
                resultList.add(newMap);
            }

            return resultList;
        } catch (IOException e) {
            // 异常处理
            e.printStackTrace();
        }
        return null;
    }


}

到了这里,关于Java 调用 WebService 、java调用Soap请求、Java对接soap接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java发送soap请求和解析soap的响应

    2024年02月11日
    浏览(42)
  • 理解WebService SOAP、Restful、HTTP(post、get)请求

    Webservice 两种实现方式(SOAP、Restful)跟HTTP(post/get) 直接请求各个优缺点,以及如何判断选择使用哪一种。 HTTP-GET和HTTP-POST是 标准协议 ,他们使用HTTP( 超文本传输协议 )谓词对参数进行编码并将参数作为名称/值对传递,还使用关联的请求语义。每个协议都包含一系列H

    2024年02月07日
    浏览(34)
  • FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice

    前几篇笔记习练了IIS soapis30配置、VB6 webservice创建、Delphi7和VB6 webservice访问: VB6 COM webservice发布,VB.NET和Delphi 7 对webservice访问,及MS Soap Toolkit 3.0在IIS上的ISAPI配置_Mongnewer的博客-CSDN博客 本篇笔记重点编写 Delphi7 DLL 对MS soap3 进行封装,让FreeBASIC通过Delphi7的DLL封装,访问IIS上的

    2024年02月09日
    浏览(37)
  • 第六十五天 API安全-接口安全&WebPack&REST&SOAP&WSDL&WebService

    1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接:https://www.jianshu.com/p/e48db27d7c70 内容点: SOAP(Simple Object Access Protocol)简单对象访问协议是交换数据的一种协议规范, 是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计 成在WEB上

    2024年02月22日
    浏览(33)
  • 接口漏洞-WebService-wsdl+SOAP-Swagger+HTTP-WebPack

    什么是接口?        接口就是位于复杂系统之上并且能简化你的任务,它就像一个中间人让你不需要了解详细的所有细节。像谷歌搜索系统,它提供了搜索接口,简化了你的搜索任务。再像用户登录页面,我们只需要调用我们的登录接口,我们就可以达到登录系统的目的

    2024年02月07日
    浏览(29)
  • .NetCore调用Soap接口

    添加服务引用的方式无法满足我请求Soap接口,所以写了个Soap帮助类,使用HttpClient的方式请求接口。 提示:以下是本篇文章正文内容,下面案例可供参考 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 可选的

    2024年02月04日
    浏览(28)
  • java请求SAP系统,发起soap的xml报文,实体类转换,idea自动生成教程

    1、将接口的网页地址,右键保存,然后修改文件后缀为wsdl文件 2、idea全局搜索 wsdl,找到自动转换javabean插件: 3、点击后,选择下载改完后缀的文件(选择):      4、将无用的class文件删除掉 5、请求sap的地址为:最下边有两个地址,http和https的,请求地址为http的,后缀改一

    2024年02月12日
    浏览(26)
  • Webservice--HTTP,SOAP协议区别

    1.HTTP,SOAP协议区别及联系 HTTP(Hypertext Transfer Protocol)和SOAP(Simple Object Access Protocol)是 WebService 技术中的两个不同协议,以下区别和联系: 区别: 技术目标: HTTP 是一种用于在客户端和服务器之间传输超文本的协议 ,它主要用于 Web 页面的传输和访问;而 SOAP 是一种用于

    2024年02月02日
    浏览(32)
  • 基于SpringBoot 的SOAP WebService实现(二)

    成功启动springboot应用后,使用postman新建POST请求,地址: http://localhost:8080/soap/userManagement  正文body选择raw,XML格式。 headers填入如下键值对:  其中xlms字段是 WSDL中的namespace字段。   发送请求,返回了一个User类 。 至此,webservice SOAP服务发布测试成功。 新建客户端模块,m

    2024年02月09日
    浏览(27)
  • java对接webservice接口的四种方式

    这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的三种方式。 方式一:以HttpURLConnection的方式调用 方式二:使用apache-cxf生成java类调用 下载apache-cxf并配置环境变量(参照JAVA环境变量配置),配置成

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包