Java 发送SOAP请求调用WebService,解析SOAP报文

本文介绍了一种使用Java模拟SOAP UI调用WebService的方法,并解析返回的XML报文。文中提供了完整的测试代码,包括构建SOAP请求、发送HTTP POST请求、处理返回的数据等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

记录测试代码

SoapUI调用路径

http://localhost:8082/*/webservices/**Service?wsdl
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.xpath.DefaultXPath;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Collections;
import java.util.List;

/**
 * 模拟soapUI调用WebService,解析返回报文
 * Created by PengHongfu 2018-04-26 15:36
 */
public class TestSoap {

    //测试环境地址
    public static String INVOICE_WS_URL = "http://localhost:8082/*/webservices/**Service";

    public static void main(String[] args) throws Exception {

        String sid = "SID值";
        String content = "报文内容,jOSN格式";
        String tranSeq = "UUID";
        String tranReqDate = "2018-04-24";
        StringBuffer stringBuffer = testWebService(sid, content, tranSeq, tranReqDate);

        // 打印HTTP响应数据
        System.out.println(stringBuffer);

        //处理返回数据
        String xmlResult = stringBuffer.toString().replace("&lt;", "<");
        String rtnCode = getXmlMessageByName(xmlResult, "rtnCode");//报文返回状态码,0表示正常,3表示错误
        String message = getXmlMessageByName(xmlResult, "message");//返回信息,主要是状态码不正常时抛出
        String body = getXmlMessageByName(xmlResult, "body");//返回正文数据,需要base64解密
        if ("0".equals(rtnCode)) {
            //查询成功
            if (StringUtils.isNotBlank(body)) {
                //解密base64加密数据
                Base64.Decoder decoder = Base64.getDecoder();
                byte[] encodedText = body.getBytes();
                String decrypt = new String(decoder.decode(encodedText), "UTF-8");
                System.out.println(decrypt);
            }
        } else {
            //查询失败
        }
    }

    // 调用WS
    private static StringBuffer testWebService(String sid, String content, String tranSeq, String tranReqDate) throws Exception {
        //拼接请求报文
        String sendMsg = appendXmlContext(sid, content, tranSeq, tranReqDate);
        // 开启HTTP连接ַ
        InputStreamReader isr = null;
        BufferedReader inReader = null;
        StringBuffer result = null;
        OutputStream outObject = null;
        try {
            URL url = new URL(INVOICE_WS_URL);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

            // 设置HTTP请求相关信息
            httpConn.setRequestProperty("Content-Length",
                    String.valueOf(sendMsg.getBytes().length));
            httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            httpConn.setRequestMethod("POST");
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);

            // 进行HTTP请求
            outObject = httpConn.getOutputStream();
            outObject.write(sendMsg.getBytes());

            if (200 != (httpConn.getResponseCode())) {
                throw new Exception("HTTP Request is not success, Response code is " + httpConn.getResponseCode());
            }
            // 获取HTTP响应数据
            isr = new InputStreamReader(
                    httpConn.getInputStream(), "utf-8");
            inReader = new BufferedReader(isr);
            result = new StringBuffer();
            String inputLine;
            while ((inputLine = inReader.readLine()) != null) {
                result.append(inputLine);
            }
            return result;

        } catch (IOException e) {
            throw e;
        } finally {
            // 关闭输入流
            if (inReader != null) {
                inReader.close();
            }
            if (isr != null) {
                isr.close();
            }
            // 关闭输出流
            if (outObject != null) {
                outObject.close();
            }
        }

    }

    //拼接请求报文
    private static String appendXmlContext(String sid, String content, String tranSeq, String tranReqDate) {
        // 构建请求报文

        StringBuffer stringBuffer = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:com=\"http://com.foresee.top.service/\">\n" +
                "  <soapenv:Body>\n" +
                "    <ns1:doService xmlns:ns1=\"http://cn.gov.chinatax.gt3nf.nfzcpt.service/\">\n" +
                "      <reqXml><![CDATA[<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<tiripPackage xmlns:xsi=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\" xsi:type=\"tiripPackage\">\n" +
                "  <sessionId/>\n" +
                "  <service>\n" +
                "    <sid>" + sid + "</sid>\n" +         
                "    <version>1.0</version>\n" +
                "    <tranSeq>+" + tranSeq + "</tranSeq>\n" +
                "    <tranReqDate>" + tranReqDate + "</tranReqDate>\n" +
                "  </service>\n" +
                "  <bizContent>\n" +
                "    <content>" + content + "</content>\n" +
                "    <paramList>\n" +
                "      <param>\n" +
                "        <name>docType</name>\n" +
                "        <value>json</value>\n" +
                "      </param>\n" +
                "      <param>\n" +
                "        <name>className</name>\n" +
                "        <value>GGG</value>\n" +
                "      </param>\n" +
                "    </paramList>\n" +
                "  </bizContent>\n" +
                "</tiripPackage>\n" +
                "]]></reqXml>\n" +
                "    </ns1:doService>\n" +
                "  </soapenv:Body>\n" +
                "</soapenv:Envelope>");
        return stringBuffer.toString();
    }

    //解析报文,根据末节点名称获取值
    private static String getXmlMessageByName(String xmlResult, String nodeName) throws DocumentException {
        Document doc = DocumentHelper.parseText(xmlResult);
        DefaultXPath xPath = new DefaultXPath("//" + nodeName);
        xPath.setNamespaceURIs(Collections.singletonMap("ns1", "http://cn.gov.chinatax.gt3nf.nfzcpt.service/"));
        List list = xPath.selectNodes(doc);
        if (!list.isEmpty() && list.size() > 0) {
            Element node = (Element) list.get(0);
            return node.getText();
        }
        return "";
    }
}

针对下面的报文格式,取节点值:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
  <soap:Body> 
    <ns1:doServiceResponse xmlns:ns1="http://cn.gov.chinatax.gt3nf.nfzcpt.service/">  
      <return><![CDATA[<taxML><service><sid>SID值</sid><channelType>10</channelType><version>1.0</version><tranSeq>UUID</tranSeq><tranReqDate>20171204</tranReqDate></service><bizContent><bizResult><head><rtnCode>0</rtnCode><rtnMsg><code>000</code><message>处理成功</message><reason></reason></rtnMsg></head><body>PFJFU1BPTlNFX0NPT1k+(BASE64加密后的数据)</body></bizResult></bizContent><returnState><returnCode>00000</returnCode><returnMessage>Success!</returnMessage></returnState></taxML>]]></return> 
    </ns1:doServiceResponse> 
  </soap:Body> 
</soap:Envelope>
### 回答1: Java可以通过SOAP协议调用Web Service接口。具体步骤如下: 1. 创建一个SOAP消息请求体,包括SOAP消息头和SOAP消息体。 2. 创建一个SOAP连接对象,并设置连接的URL地址。 3. 发送SOAP消息请求,等待Web Service接口返回SOAP消息响应。 4. 解析SOAP消息响应,获取需要的数据。 5. 关闭SOAP连接对象。 需要注意的是,调用Web Service接口需要提供接口的WSDL文件,以便生成客户端代码。可以使用Java自带的wsimport工具生成客户端代码,也可以使用第三方工具如Apache CXF等。 另外,调用Web Service接口时需要注意SOAP消息的格式和命名空间等问题,以确保请求和响应能够正确解析。 ### 回答2: Java是一门广泛应用于开发Web应用程序的高级编程语言。它是一门面向对象的语言,具备简单易学、可移植性强、安全性高等特点,被广泛地应用于各种软件开发领域中。Java调用WebService接口,是现在Web开发中非常重要的技术之一。 WebService(简称WS)是基于Web的远程调用协议,用于服务提供者和服务消费者之间的互操作。它是一种跨平台、跨语言的通信方式,其中SOAP(简单对象访问协议)是一种常用的WebService交互协议。Java可以通过SOAP调用WebService接口服务。 Java中使用SOAP调用WebService接口的步骤如下: 1.编写WebService客户端代码 Java提供了访问WebService接口服务的类:javax.xml.soap.SOAPConnection和javax.xml.soap.SOAPConnectionFactory。我们可以通过下面的代码获取SOAPConnection: ``` SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); ``` 2.创建SOAP请求SOAP请求中,我们需要设置相关的参数,包括:SOAP消息的版本、SOAP请求消息体、SOAP请求头等。下面是创建请求消息的代码示例: ``` //初始化一个SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage soapMessage = messageFactory.createMessage(); //创建SOAP报文SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); ``` 3.设置SOAP请求参数 在请求中,需要设置相关参数,包括EndPoint地址、SOAPAction、参数值等。下面是设置请求参数的代码示例: ``` //设置WebService请求地址 URL url= new URL("http://www.example.com/WebService"); //创建一个SOAP消息并设置Header和Body SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); //设置要调用WebService方法名 String methodName = "getWebServiceResult"; //设置SoapAction String soapAction = "http://www.example.com/WebService/getWebServiceResult"; soapMessage.getMimeHeaders().addHeader("SOAPAction", soapAction); //调用WebService SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); SOAPMessage response = connection.call(soapMessage, url); ``` 4.解析SOAP响应 在获取WebService接口服务的结果后,我们需要对SOAP响应进行解析。下面是解析SOAP响应的代码示例: ``` //解析响应数据 SOAPBody soapBody = response.getSOAPBody(); NodeList nodeList = soapBody.getElementsByTagName("return"); String responseStr = nodeList.item(0).getTextContent();//获取返回值 ``` 综上所述,Java调用WebService接口SOAP的过程包括了编写WebService客户端代码、创建SOAP请求、设置SOAP请求参数及解析SOAP响应等步骤。这些步骤的实现可以帮助我们更好地调用WebService接口,并获取接口的响应结果。 ### 回答3: Java 语言作为一种广泛应用于企业级应用的编程语言,自然对接webservice等网络接口是其常见的应用场景之一。在Java中,调用webservice接口有多种方法,其中最常用的是使用soap协议来调用webservice接口。 soap协议即简单对象访问协议,是一种基于XML的协议,用于将网络上的消息传递给远程执行的程序。使用soap协议调用webservice接口可以实现跨平台、跨语言、跨网络的消息传递,是一种比较常用的通信方式。 在Java中,调用webservice接口需要使用Java API for XML Web Services(JAX-WS)技术。JAX-WS是一种Java EE标准,提供了一套API,支持Java应用与webservice接口之间的通信。以下是调用webservice接口的步骤: 1. 创建一个JAX-WS客户端工程(Client Project),该工程用于调用webservice接口。可以在Eclipse、IntelliJ IDEA等IDE中创建该工程。 2. 在工程中创建一个webservice客户端代理(Web Service Client Proxy),用于调用webservice接口。可以使用Eclipse这类IDE中提供的WSDL文件生成工具(例如wsimport)来生成webservice客户端代理。 3. 使用生成的webservice客户端代理来调用webservice接口。在Java中,使用webservice客户端代理对象调用webservice接口的过程类似于使用Java接口调用远程程序,可以通过SOAPMessage传输请求和响应信息,完成与webservice接口进行交互的过程。 需要注意的是,在调用webservice接口时,需要提供webservice接口的URL、命名空间(Namespace)、操作名称(Operation)等信息。另外,我们还可以为webservice接口提供请求头信息(Header)和请求参数(Parameter),以便webservice端正确地处理请求。 总之,通过Java调用webservice接口,在很多应用中都是必不可少的一步,特别是在企业级应用中更是如此。因此,我们需要深入理解soap协议和JAX-WS技术的原理和应用,才能在实际开发中进行合理的使用和优化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值