java模拟Soap请求测试Web Service接口,发现Web Service响应内容中的中文竟然是编码格式。比如:
中文:退保成功
Soap中文编码:退保成功
 
我仔细分析后发现,退编码实际上就是Unicode编码的Soap版,正规的Unicode编码是\u9000,Soap改成自己的格式&#x[4位内容];格式。
 
还有其他的比如:
换行,Soap编码:
单引号,Soap为转换为html编码:'
与号,Soap为转换为html编码:&
小于号,Soap为转换为html编码:<
等等
 
因此,结合以上情况。想看到直观的内容,就需要解密这些编码了。解密简单,利用正则替换实现。这里介绍下Soap中文编码的解密:
1.将退替换成\u9000。替换&#x为\u,去掉分号
2.解密Unicode编码\u9000
 
为了更直观看Soap响应内容,我还替换了Soap换行符编码
&#xd替换为\n换行符
 
 
java代码:
WSClient_SOAP.java
package com.sfasdfsdafd.core.webservice.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.junit.Test; import com.sfasdfsdafd.core.utils.xml.XmlUtil4Jdom; /**
* 类名:com.sfasdfsdafd.core.webservice.WSClient_SOAP
*
* <pre>
* 描述: 测试类
* 基本思路:
* public方法:
* 特别说明:
* 创建时间:2013-4-9 下午10:29:04
* 修改说明: 类的修改说明
* </pre>
*/
public class WSClient_SOAP { static Logger log = Logger.getLogger(WSClient_SOAP.class);// 日志记录对象 private static String NAMESPACE = "http://access.control.core.sfasdfsdafd.com/";
private static String NAMESPACE_JBOSS = "http://access.restful.core.sfasdfsdafd.com/";
private static String ENCODING_UTF_8 = "UTF-8";
private static String ENCODING_GBK = "GBK"; /**
* 测试WebService接口 <br><pre>
* @param 参数类型 参数名 说明
* @return void 说明
* @throws 异常类型 说明
*/
// @Test
public void testSOAPRequest() throws IOException,Exception {
long d1 = System.currentTimeMillis();
String returnMsg = "";
StringBuffer sTotalString = new StringBuffer();
OutputStream os = null;
URLConnection conn = null;
InputStream is = null;
try {
String iDzswXml = "模拟客户端请求WebService接口"; File file = new File("abc.xml");
iDzswXml = FileUtils.readFileToString(file, ENCODING_GBK);
iDzswXml = encodeValue(iDzswXml); StringBuffer soap = new StringBuffer();
soap.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"")
.append(" xmlns:acc=\"" + NAMESPACE + "\"> ")
.append(" <soapenv:Header/>")
.append(" <soapenv:Body>")
.append(" <execService4DZSW>")
.append(" <iDzswXML>")
.append(iDzswXml)
.append(" </iDzswXML>")
.append(" </execService4DZSW>")
.append("</soapenv:Body>")
.append(" </soapenv:Envelope>"); URL url = new URL("http://localhost:8080/iDzsw-interface/ws/iDzswAICWS");
// URL url = new URL("http://10.111.184.20:13000/iDzsw-interface/ws/iDzswAICWS");
conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true); conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
conn.setRequestProperty("Content-Type", "text/xml; charset=" + ENCODING_GBK);
conn.setRequestProperty("SOAPAction", "execService4DZSW"); os = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, ENCODING_GBK); String reqs = soap.toString();
reqs = decodeValue(reqs);
log.info("模拟客户端请求WebService发送报文:\n" + reqs); osw.write(soap.toString());
osw.flush();
osw.close(); String sCurrentLine = "";
is = conn.getInputStream();
BufferedReader l_reader = new BufferedReader(new InputStreamReader(is, ENCODING_GBK));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString.append(sCurrentLine);
}
returnMsg = sTotalString.toString();
returnMsg = decodeValue(returnMsg);
returnMsg = decode4SoapValue(returnMsg);
} catch (Exception e) {
log.error("请求WebService出现异常", e);
} finally {
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
} long d2 = System.currentTimeMillis();
log.info("WebService返回:\t" + returnMsg + "\n耗时:"+ (d2 - d1));
} // @Test
public void testSOAPRequest4JBoss() throws IOException,Exception {
long d1 = System.currentTimeMillis();
String returnMsg = "";
StringBuffer sTotalString = new StringBuffer();
OutputStream os = null;
URLConnection conn = null;
InputStream is = null;
try {
String iDzswXml = "模拟客户端请求WebService接口"; File file = new File("abc.xml");
iDzswXml = FileUtils.readFileToString(file, ENCODING_GBK);
iDzswXml = encodeValue(iDzswXml); StringBuffer soap = new StringBuffer();
soap.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"")
.append(" xmlns:acc=\"" + NAMESPACE_JBOSS + "\"> ")
.append(" <soapenv:Header/>")
.append(" <soapenv:Body>")
.append(" <acc:execService4DZSW>")
.append(" <iDzswXML>")
.append(iDzswXml)
.append(" </iDzswXML>")
.append(" </acc:execService4DZSW>")
.append("</soapenv:Body>")
.append(" </soapenv:Envelope>"); URL url = new URL("http://localhost:8081/iDzsw-interface/ws/iDzswAICWS");
conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true); conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
conn.setRequestProperty("Content-Type", "text/xml; charset=" + ENCODING_GBK);
conn.setRequestProperty("SOAPAction", "execService4DZSW"); os = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, ENCODING_GBK); String reqs = soap.toString();
reqs = decodeValue(reqs);
log.info("模拟客户端请求WebService发送报文:\n" + reqs); osw.write(soap.toString());
osw.flush();
osw.close(); String sCurrentLine = "";
is = conn.getInputStream();
BufferedReader l_reader = new BufferedReader(new InputStreamReader(is, ENCODING_GBK));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString.append(sCurrentLine);
}
returnMsg = sTotalString.toString();
returnMsg = decodeValue(returnMsg);
returnMsg = decode4SoapValue(returnMsg);
} catch (Exception e) {
log.error("请求WebService出现异常", e);
} finally {
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
} long d2 = System.currentTimeMillis();
log.info("WebService返回:\t" + returnMsg + "\n耗时:"+ (d2 - d1));
} /**
* 测试合zuojigou的回调接口 <br><pre>
* @param 参数类型 参数名 说明
* @return void 说明
* @throws 异常类型 说明
*/
// @Test
public void testCallback() throws IOException,Exception {
long d1 = System.currentTimeMillis();
String returnMsg = "";
StringBuffer sTotalString = new StringBuffer();
OutputStream os = null;
URLConnection conn = null;
InputStream is = null;
try {
String iDzswXml = "URL TEST";
File file = new File("abc.xml");
iDzswXml = FileUtils.readFileToString(file, ENCODING_GBK);
iDzswXml = encodeValue(iDzswXml); StringBuffer soap = new StringBuffer();
soap.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"")
.append(" xmlns:acc=\"" + NAMESPACE + "\"> ")
.append(" <soapenv:Header/>")
.append(" <soapenv:Body>")
.append(" <callbackProcess>")
.append(" <xmlMsg>")
.append(iDzswXml)
.append(" </xmlMsg>")
.append(" </callbackProcess>")
.append("</soapenv:Body>")
.append(" </soapenv:Envelope>"); URL url = new URL("http://localhost:8080/iDzsw-interface/ws/abCallbackWS");
conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true); conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
conn.setRequestProperty("Content-Type", "text/xml; charset=" + ENCODING_GBK);
conn.setRequestProperty("SOAPAction", "execService4DZSW"); os = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, ENCODING_GBK); log.info("模拟客户端请求WebService发送报文:\n" + soap.toString()); osw.write(soap.toString());
osw.flush();
osw.close(); String sCurrentLine = "";
is = conn.getInputStream();
BufferedReader l_reader = new BufferedReader(new InputStreamReader(is, ENCODING_GBK));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString.append(sCurrentLine);
}
returnMsg = sTotalString.toString();
} catch (Exception e) {
log.error("请求WebService出现异常", e);
} finally {
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
} long d2 = System.currentTimeMillis();
log.info("WebService返回:\t" + returnMsg + "\n耗时:"+ (d2 - d1));
} /**
* 测试Socket接口 <br><pre>
* @param 参数类型 参数名 说明
* @return void 说明
* @throws 异常类型 说明
*/
@Test
public void testSocket() {
// 本地地址
String coreAddress = "127.0.0.1";
// 测试环境地址
// String coreAddress = "10.111.184.20";
// 测试环境外网访问地址
// String coreAddress = "221.166.48.163";
// 新Project端口号
int corePort = 8001;
// 老Project端口号
// int corePort = 8080; Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
String message = null;
// 收到的报文
StringBuffer stringBuffer = new StringBuffer();
String receiveString = null; File file = new File("abc.xml"); try {
socket = new Socket(coreAddress, corePort);
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), ENCODING_GBK), true); String msg = FileUtils.readFileToString(file, ENCODING_GBK);
out.println(msg);
out.flush(); in = new BufferedReader(new InputStreamReader(socket.getInputStream(), ENCODING_GBK)); while ((message = in.readLine()) != null) {
// System.out.println(message);
// System.out.println(new String(message.getBytes("UTF-8"))); stringBuffer.append(message);
} receiveString = stringBuffer.toString();
} catch (UnknownHostException e) {
log.error("没有找到服务器", e);
} catch (IOException e) {
log.error("与服务器通信出现异常", e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
log.error("关闭连接出现异常", e);
}
} log.info("客户端收到服务器返回的报文是:" + receiveString);
} /**
* 特殊字符转码
*
* @param value
* @return
*/
private static String encodeValue(String value) {
value = value.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("'", "&apos;")
.replaceAll("\"", "&quot;");
return value;
} /**
* 特殊字符解码
*
* @param value
* @return
*/
public static String decodeValue(String value){
value=value
.replaceAll("&amp;", "&")
.replaceAll("&lt;", "<")
.replaceAll("&gt;", ">")
.replaceAll("&apos;", "'")
.replaceAll("&quot;", "\"");
return value;
} /**
* 解码 &#xXXXX;
* @param str
* @return
*/
public static String decode4SoapValue(String value){
value=value
.replaceAll("&#xd", "\n")
.replaceAll("&#x", "\\\\u")
.replaceAll(";", "");
value = decodeUnicode(value);
return value;
} /**
* 解码 Unicode \\uXXXX
* @param str
* @return
*/
public static String decodeUnicode(String str) {
Charset set = Charset.forName("UTF-16");
Pattern p = Pattern.compile("\\\\u([0-9a-fA-F]{4})");
Matcher m = p.matcher( str );
int start = 0 ;
int start2 = 0 ;
StringBuffer sb = new StringBuffer();
while( m.find( start ) ) {
start2 = m.start() ;
if( start2 > start ){
String seg = str.substring(start, start2) ;
sb.append( seg );
}
String code = m.group( 1 );
int i = Integer.valueOf( code , 16 );
byte[] bb = new byte[ 4 ] ;
bb[ 0 ] = (byte) ((i >> 8) & 0xFF );
bb[ 1 ] = (byte) ( i & 0xFF ) ;
ByteBuffer b = ByteBuffer.wrap(bb);
sb.append( String.valueOf( set.decode(b) ).trim() );
start = m.end() ;
}
start2 = str.length() ;
if( start2 > start ){
String seg = str.substring(start, start2) ;
sb.append( seg );
}
return sb.toString() ;
} }
参考文章:

Web Service之Soap请求响应内容中文编码解密的更多相关文章

  1. 使用TcpTrace小工具截获Web Service的SOAP报文

    Web Service客户端对服务端进行调用时,请求和响应都使用SOAP报文进行通讯.在开发和测试时,常常查看SOAP报文的内容,以便进行分析和调试.TcpTrace是一款比较小巧的工具,可以让我们截 ...

  2. Web service standards: SOAP, REST, OData, and more

    Web service standards: SOAP, REST, OData, and more So far, we've covered the components of a web ser ...

  3. 建立自己的Web service(SOAP篇)

    1.简介 这篇文章主要介绍采用SOAP来建立以及访问Web service接口. Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用 ...

  4. Web APi之捕获请求原始内容的实现方法以及接受POST请求多个参数多种解决方案(十四)

    前言 我们知道在Web APi中捕获原始请求的内容是肯定是很容易的,但是这句话并不是完全正确,前面我们是不是讨论过,在Web APi中,如果对于字符串发出非Get请求我们则会出错,为何?因为Web A ...

  5. 几种远程调用接口协议简单比较和web service(SOAP)与HTTP接口的区别:

    什么是web service?       答:soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml任何数据都可以xml化. ...

  6. nginx配置打印请求响应内容

    #放在http{}里面 log_format kyh ' [$time_local] "$request" $status \n' 'req_header:"$req_h ...

  7. Jmeter——请求响应内容乱码解决办法

    前段时间,换过一次设备,重新下载了Jmeter.有一次在编写脚本时,响应内容中的中文一直显示乱码. 遇到乱码不要慌,肯定是有办法来解决的.具体解决办法,可以参考之前的博文,Jmeter--BeanSh ...

  8. ASP.NET Web Service 标准SOAP开发案例代码(自定义验证安全头SOAPHeader)

    using System.Xml;using System.Xml.Serialization;using System.Web.Services.Protocols;using System.Con ...

  9. http协议请求响应内容示例

    POST http://www.cytxl.com.cn/api/common/login.php?XDEBUG_SESSION_START=netbeans-xdebug HTTP/1.1 Host ...

随机推荐

  1. 51Nod 1003 1004 1009

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1 ...

  2. CSDN数据库下载地址 CSDN 用户名密码泄漏,600万数据下载

    原文发布时间为:2011-12-21 -- 来源于本人的百度文章 [由搬家工具导入] 12月21日消息,下午有网友爆料称国内最大的开发者社区CSDN.NET的安全系统遭到黑客攻击,CSDN数据库中的6 ...

  3. Accelerating Enum-Based Dictionaries with Generic EnumComparer

    原文发布时间为:2011-03-03 -- 来源于本人的百度文章 [由搬家工具导入] 文章:http://www.codeproject.com/KB/cs/EnumComparer.aspx 源码: ...

  4. @RequestMapping定义不同的处理器映射规则

    通过@RequestMapping注解可以定义不同的处理器映射规则. 1. URL路径映射 @RequestMapping(value="item")或@RequestMappin ...

  5. duilib入门简明教程 -- VS环境配置(2) (转)

    原文转自:http://www.cnblogs.com/Alberl/p/3342030.html     既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错 ...

  6. error LNK2001: unresolved external symbol __imp__WSAStartup@8 SOCKET(转)

    VC6.0下的错误信息: error LNK2001: unresolved external symbol __imp__socket@12 error LNK2001: unresolved ex ...

  7. Jquery 返回json数据在IE浏览器中提示下载的问题

    Jquery 返回json数据,IE浏览器提示下载的问题,当提交完数据后返回的本来是json数据的,在火弧里测试正常,解决方法如下 今天遇到Jquery 返回json数据,IE浏览器提示下载的问题,当 ...

  8. Ceres Solver: 高效的非线性优化库(一)

    Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...

  9. BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3402 Description     贝茜在和约翰玩一个“捉迷藏”的游戏.     她正要找出所有适 ...

  10. 调参tips

    对于一个模型,都可以从以下几个方面进行调参: 1. 对weight和bias进行初始化(效果很好,一般都可以提升1-2%) Point 1 (CNN): for conv in self.convs1 ...