客户端字符串编码导致的服务器端诡异问题

本文介绍了一种HTTP接口测试中遇到的乱码问题及解决方案。通过调整客户端发送的中文参数编码方式,解决了Server2接口返回乱码的问题,并确保了服务器能够正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景: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);
}

转码前日志,


转码后日志,



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值