序
昨天在做一个 Demo 的时候,由于是调用第三方的接口,采用的是 HTTP 的通信协议,按照文档上的说明,需要把参数进行加密后加入到 URL 中,但是,就是这个看似普普通通的操作,却让我着实费了很大的劲。
背景
关于 BASE64,我不想说太多,因为这是很基本的一种编码方式,或者说是加密方式。不了解的可以到我前面的博客中去看看,关于加密,前边有一个系列的文章。下面说说出现这个问题的情景。
昨天拿到一个任务,写一个 Demo,目的是查询一系列的信息,当然,需要调用一个第三方的接口,根据接口文档中的说明,该接口采用的是 HTTP 协议,Post 的数据需要进行 BASE64 加密,由于我之前自己封装了一系列的加密算法,因此,就直接拿过来用了。这里先说明一下,在我封装的加密算法中,用到的是 sun 的 BASE64Encoder,也就是说,我引入的是这个类:
import sun.misc.BASE64Encoder;
这里看不出有什么问题,请接着看下边。
出现的问题
就这样,每当测试的时候,程序总是会报同一个错误 —— (java.net.MalformedURLException:Illegal character in URL),刚开始的时候,我还以为是自己写的 模拟 Post 提交的代码有问题呢,于是网上查了又查,最后发现没有什么问题。于是,排除了这一块,就开始找别的原因。什么百度、Google 都查遍了,问题也没有解决,当初也没有想到是
BASE64 加密的问题。因为之前一直在用,也没有出现什么错误。
这个问题从中午一直持续到了下班之前,记得还是下午 5 点多的时候,终于从网上发现一篇文章,好像也是遇到了同样的问题,从他的文章中找到了原因。
解决方案
之所以出现这样的问题,是由于在 BASE64 加密的过程中,引错了 jar 包,不应该使用 Sun 提供的内部包,也就是 sun.misc,后来了解到 sun.misc 包是 Sun 公司提供给内部使用的专用 API,在 java API 文档中我们看不到任何有关 BASE64 影子,不建议使用。
经过测试,我发现,除了使用 sun.misc 包的 BASE64 报错外,其他两个都可以正常运行,这两个包括:
- com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
- org.apache.commons.codec.binary.Base64;
这两个提供的实现都可以正常运行。至于这两个的加密方法嘛,百度一下下吧。。。
结束语
通过这个问题,我发现,很多时候,我们往往忽略一些看似很没用的东西,而正是这些没用的东西,时不时的会在我们的路途中横上一杠子,我想说的是,尽管会出现这样那样的问题,还是要耐着性子去解决,不要把问题留给以后。
而且,当我们在学习某一类知识的时候,如果有时间,可以多想想,涉及一下与其相关的知识,或许你会有意想不到的收获。
版权声明:本文为博主原创文章,未经博主允许不得转载。