https://blog.csdn.net/Peng_Hong_fu/article/details/80113196

记录测试代码

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("<", "<");
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>

  

Java 发送SOAP请求调用WebService,解析SOAP报文的更多相关文章

  1. 发送Http请求调用webService

    如果调用WebService的不是在.NET中,无法直接添加web引用,那怎么调用webservice. 有两种方式 第一种方式:GET方式 string strUrl = "http:// ...

  2. Js/Ajax中发送HttpPost请求调用WebService

    1) WebService中的方法 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(Confo ...

  3. webService 发送soap请求,并解析返回的soap报文

    本例应用场景:要做一个webService测试功能,不局限于任何一种固定格式的webService,所以像axis,cxf等框架就不好用了.只有深入到webService的原理,通过发收soap报文, ...

  4. Jmeter发送SOAP请求对WebService接口测试

    Jmeter发送SOAP请求对WebService接口测试 1.测试计划中添加一个用户自定义变量 2.HTTP信息头管理器,添加Content-Tpe,  application/soap+xml;c ...

  5. C#如何使用Soap协议调用WebService?

    WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...

  6. 使用Java发送Http请求的内容

    公司要将自己的产品封装一个WebService平台,所以最近开始学习使用Java发送Http请求的内容.这一块之前用PHP的时候写的也比较多,从用最基本的Socket和使用第三方插件都用过. 学习了J ...

  7. Java发送Http请求并获取状态码

    通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...

  8. 通过java发送http请求

    通常的http请求都是由用户点击某个连接或者按钮来发起的,但是在一些后台的Java程序中需要发送一些get或这post请求,因为不涉及前台页面,该怎么办呢? 下面为大家提供一个Java发送http请求 ...

  9. C# 使用 HttpPost 请求调用 WebService

    之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用 ...

随机推荐

  1. Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别

    ava.io下面有两个抽象类:InputStream和ReaderInputStream是表示字节输入流的所有类的超类Reader是用于读取字符流的抽象类InputStream提供的是字节流的读取,而 ...

  2. NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树

    题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...

  3. Win7 配置免安装mysql5.7.20过程详解

    转载:https://www.2cto.com/database/201406/312689.html 转载:http://blog.csdn.net/hekaihaw/article/details ...

  4. How to install Maven on Windows

    To install Apache Maven on Windows, you just need to download the Maven’s zip file, and Unzip it to ...

  5. Java:The hierarchy of the type is inconsistent错误

    错误 The type com.jiuqi.dna.ui.language.INLStringGroup cannot be resolved. It is indirectly referenced ...

  6. for和while循环的区别

    区别:for循环,就是遍历某一对象,通俗说就是根据循环次数限制做多少次重复操作.while循环,是当满足什么条件的时候,才做某种操作. for为遍历循环 while为直到循环

  7. Git学习笔记--- diff工具 kdiff3

    图形化的git diff 与 git merge工具:kdiff3 1.安装 win10: 去官网左边找到Download,下载双击安装. Linux(Debian Ubuntu 18.04): ap ...

  8. BZOJ 4159 [Neerc2009]Business Center

    思路 简单的模拟,答案就是\(min\{(\lfloor\frac{d\times n}{u+d}\rfloor+1)\times(u+d)-d\times n\}\) 代码 #include < ...

  9. (转载)winform图片标尺控件

    最近要做个winform的东西,要在里面集成一个类似Windows自带画图的标尺功能,还要能在图片上画矩形框.在网上找了好久也没找到写好的控件,无奈自己做了一个. 目前还有些bug,这里先做个分享.( ...

  10. Derek解读Bytom源码-启动与停止

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...