Jmeter,查看结果树,返回了非中文,中文返回了Unicode编码
前提
本人请求均是json格式请求
查找过程
当时尝试了多种方法,由于查找了有部分博文都是说可以直接添加BeanShell PostProcessor,在其中加一段代码就可以解决,或者是可以通过修改配置,但是加代码这种方式也提到了一些副作用,会占用资源,可能在高并发测试过程中会有点影响结果,修改配置的话由于也不是特别想要修改,所以也没有尝试,所以就尝试了其他方式,发现基本都没有用;
尝试过的方式如下
1、第一种方法,在HTTP Header Manager中添加 Accept-Charset:utf-8,发现并没有用
2、第二种方法,在HTTP Header Manager中添加Content-Type:charset=utf-8,发现也没有用
最后还是无用,所以用了BeanShell PostProcessor中添加代码的方式
1、添加的这段代码发现并不生效,代码段是: prev.setDataEncoding(“UTF-8”);
2、后来添加过两段代码,代码段一没生效,代码段二生效了,这(代码段放在后面了,均是查找到的其他博文的,链接放在最后了)
最后发现原来查看结果树里面设置查看方式是json则展示就是中文的,如果是text就是unicode的;
在这,不得不说一下,当时的历程
当时已经把查看结果树的显示格式改成了json,但是不想用添加代码的这种方法,所以又继续找,看到一篇博文给了启发,在请求头管理器中添加Content-Type:application/json,成功的返回了中文;还得出了感慨:“还是自己的经验太少了呀,之前不想在请求头里面加就是因为有些接口不是使用的这种格式,但是自己的请求里面也没写,成功运行了,所以不想加,没想到啊,加了就好了”。结果最后去结果树里面把显示格式一改,改成text,打回原形,还是显示的Unicode,啪啪打脸。
上面发现不行,还是后面为了验证如果不添加是会不返回中文,再去看了一下,发现不传也可以,这不是和我之前一开始出现问题有矛盾嘛,再一看,原来查看结果树里面设置了查看方式是json,如果改成text的话就都不生效了;
为了验证每种方案的有效性,将显示格式设置成text后,上面只有添加代码段二的方式会生效了(改配置的没有进行过尝试);所以原来是如果查看方式是text那么久只有代码段二才有效,查看方式是json的话不设置任何内容都有效
总结
1、如果发现查看结果树内的数据中文是Unicode编码方式展示,那么首先看如果自己的返回结果是json则将查看方式切换到json格式,如果不是,则另说
2、如果展示方式需要是text方式就可以尝试代码段二这种(本人尝试生效了)以及改配置看看能不能行(这个没有去尝试),可能还是根据个人的接口不同将会有不同的结果吧
以上本人场景均是json类型
代码段一,添加了之后重启了jmeter也没用
//获取响应代码Unicode编码的
String s2=new String(prev.getResponseData(),"UTF-8");
//---------------一下步骤为转码过程---------------
char aChar;
int len= s2.length();
StringBuffer outBuffer=new StringBuffer(len);
for(int x =0; x <len;){
aChar= s2.charAt(x++);
if(aChar=='\\'){
aChar= s2.charAt(x++);
if(aChar=='u'){
int value =0;
for(int i=0;i<4;i++){
aChar= s2.charAt(x++);
switch(aChar){
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
value=(value <<4)+aChar-'0';
break;
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
value=(value <<4)+10+aChar-'a';
break;
case'A':
case'B':
case'C':
case'D':
case'E':
case'F':
value=(value <<4)+10+aChar-'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");}}
outBuffer.append((char) value);}else{
if(aChar=='t')
aChar='\t';
else if(aChar=='r')
aChar='\r';
else if(aChar=='n')
aChar='\n';
else if(aChar=='f')
aChar='\f';
outBuffer.append(aChar);}}else
outBuffer.append(aChar);}
代码段二,添加之后可以了,返回的是中文了
private static String ascii2native ( String asciicode )
{
String[] asciis = asciicode.split ("\\\\u");
String nativeValue = asciis[0];
try
{
for ( int i = 1; i < asciis.length; i++ )
{
String code = asciis[i];
nativeValue += (char) Integer.parseInt (code.substring (0, 4), 16);
if (code.length () > 4)
{
nativeValue += code.substring (4, code.length ());
}
}
}
catch (NumberFormatException e)
{
return asciicode;
}
return nativeValue;
}
String asciicode =new String(prev.getResponseData(),"UTF-8");
prev.setResponseData(ascii2native(asciicode));
给启发的博文:https://www.cnblogs.com/gloria-5/p/12468874.html
代码段一博文:https://blog.csdn.net/chenfeng_he/article/details/77743231
代码段二博文:https://www.cnblogs.com/peng-lan/p/12021101.html