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>

  

上一篇:BZOJ 3043: IncDec Sequence 差分 + 思维


下一篇:【BZOJ 3043】 3043: IncDec Sequence (差分)