org.apache.commons.net.util.Base64的encodeBase64String方法的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun5769675/article/details/54583889

今天在做汽车之家接口数据调用时,发现一个问题,由于对方服务器有身份验证,需要根据一定的格式将相关信息加密然后转成Base64然后放到http请求的header中。

我在实际操作中遇到奇怪问题,明明加密后的字符串是错的,可对方的iis服务却能收到这个错误的请求,尽管不会通过身份验证,这时返回错误代码是401,标识没有权限,其实就是身份验证失败。

但修改代码后,确认了加密后的字符串的正确性,可对方iis服务死活接收不到请求,我观察了下返回的错误代码是400,这标识这个请求是错误的,因此应该跟汽车之家的接口没有关系,所以就仔细的检查了请求参数。

终于….发现了问题的所在。

String encryptUrl = autohomeTripleDES.EncryptUrl(signUrl, CARHOMEUSERNAME, CARHOMEPASSWORD);
encryptUrl = Base64.encodeBase64String(encryptUrl.getBytes("UTF-8"));
Header[] headers = {new BasicHeader("Authorization","Basic " + encryptUrl)};        
String json = HttpJsonClient.getJsonData(signUrl, null, 60,headers);

这是我原来的代码,上面两次encryptUrl的结果分别是如下图,仔细看图别被结果迷惑:

这里写图片描述
这里写图片描述

看出区别了吧,转Base64后得到的字符串结尾有多余的东西,仔细看第二张图,我被这张图坑了,一开始我以为只有结尾会有,所以就直接encryptUrl.trim();结果请求死活过不去就是400,我就又回来仔仔细细的看了一遍数据,发现不单结尾有\r\n字符串的中间也有\r\n

真是坑爹啊,然后使用下面代码把\r\n替换掉,请求成功!

String encryptUrl = autohomeTripleDES.EncryptUrl(signUrl, CARHOMEUSERNAME, CARHOMEPASSWORD).replaceAll("\r\n", "");
encryptUrl = Base64.encodeBase64String(encryptUrl.getBytes("UTF-8")).replaceAll("\r\n", "");

代码返回值结果参见下图,这回正常了。

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sun5769675/article/details/54583889