背景:HttpClient进行一个http接口的测试,分别测试两个服务器的统一接口,其中的一个是乱码, 另一个正常。
Server1正常返回:
API接口,用户开户----开始,passportId:Y20160414000000003 userName:马 userNameHex:E9A9ACE7BBA7E5B9B3
Server2异常返回:
API???????----??,passportId:Y20160414000000003 userName:????????? userNameHex:3F3F3F3F3F3F3F3F3F
现象:
Server2对于服务器本身的日志就是打的乱码,参数的日志也是乱码
Server2只有这个接口的中文显示不正确,其他接口的日志正确
影响:由于服务器端获得的参数为乱码,导致服务器端不能正确识别姓名字段,返回客户端姓名格式不正确的提示信息。
原因:客户端对中文的编码和服务器端不一致,这就解释了为什么拿着服务器端收到的密文在客户端可以正常解密而在服务器端不能解密的现象。但是仍然奇怪的是服务器端打印日志中的自身设置的中文(非客户端传过来的中文)仍然为乱码,这个还是一个
Solution:
将参数userName先进行转码然后再请求接口。问题就能得到解决。
@Test(dataProvider = "user_account_open", dataProviderClass = UserAccountOpenData.class)
public void user_account_open(String comment, String passportId,String sys_key, String userName,String userIDCardType, String IDCardNo,String bankAccountNo, String bankId, String target) throws Exception {
Service service = new ServiceImpl();
String iso = new String(userName.getBytes("UTF-8"), "ISO-8859-1");
String utf = new String(iso.getBytes("ISO-8859-1"), "UTF-8");
String result = service.user_account_open(passportId,sys_key,utf,userIDCardType,IDCardNo,bankAccountNo,bankId);
Assert.assertEquals(result, target);
}
转码前日志,
转码后日志,![]()
![]()