Java 发送SOAP请求调用WebService,解析SOAP报文
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报文的更多相关文章
- 发送Http请求调用webService
如果调用WebService的不是在.NET中,无法直接添加web引用,那怎么调用webservice. 有两种方式 第一种方式:GET方式 string strUrl = "http:// ...
- Js/Ajax中发送HttpPost请求调用WebService
1) WebService中的方法 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(Confo ...
- webService 发送soap请求,并解析返回的soap报文
本例应用场景:要做一个webService测试功能,不局限于任何一种固定格式的webService,所以像axis,cxf等框架就不好用了.只有深入到webService的原理,通过发收soap报文, ...
- Jmeter发送SOAP请求对WebService接口测试
Jmeter发送SOAP请求对WebService接口测试 1.测试计划中添加一个用户自定义变量 2.HTTP信息头管理器,添加Content-Tpe, application/soap+xml;c ...
- C#如何使用Soap协议调用WebService?
WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...
- 使用Java发送Http请求的内容
公司要将自己的产品封装一个WebService平台,所以最近开始学习使用Java发送Http请求的内容.这一块之前用PHP的时候写的也比较多,从用最基本的Socket和使用第三方插件都用过. 学习了J ...
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- 通过java发送http请求
通常的http请求都是由用户点击某个连接或者按钮来发起的,但是在一些后台的Java程序中需要发送一些get或这post请求,因为不涉及前台页面,该怎么办呢? 下面为大家提供一个Java发送http请求 ...
- C# 使用 HttpPost 请求调用 WebService
之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用 ...
随机推荐
- js之 data-*自定义属性
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- svg动态添加小人
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 标签无效 "/zabbix_export/date": "YYYY-MM-DDThh:mm:ssZ" 预计。
Centos7.5 使用导入percona模板的时候报错 百度给的解决方案是 将zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1. ...
- C#操作字符串方法总结
/* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ####### ...
- 并发学习一、MPI初步认识
学习参考地址:https://www.jianshu.com/p/2fd31665e816 编程使用的vs2015 社区版本(个人感觉比Vc6.0的丑界面看起来舒服多了) MPI基本函数 MPI调用借 ...
- facebook api之Marketing API
General information on the Marketing APIs, access, versioning and more. The main use cases for the M ...
- pgAdmin的数据恢复
DOC 本地添加server 1.设置备份.恢复的exe路径.一般在pgAdmin的安装路径下可以找到 2.恢复restore,备份backup
- ASP.NET开发总结
ASP.NET的界面可以是.aspx,会对应有一个.aspx.cs的逻辑处理文件,.aspx的所有控件对应着变量,变量名就是控件的ID. 为了代码编写方便起见,一般将数据库表的新增字段,放在最后. 日 ...
- [luogu]P1852跳跳棋
题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...
- 用python读写excel的强大工具:openpyxl
最近看到好几次群里有人问xlwt.wlrd的问题,怎么说呢,如果是office2007刚出来,大家用xlsx文件用不习惯,还可以理解,这都10年过去了喂,就算没有进化到office2016,还在用of ...