昨天在做一个 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;

这两个提供的实现都能够正常执行。

至于这两个的加密方法嘛。百度一下下吧。。



结束语


通过这个问题,我发现。非常多时候。我们往往忽略一些看似非常无用的东西,而正是这些无用的东西。时不时的会在我们的路途中横上一杠子,我想说的是,虽然会出现这样那样的问题。还是要耐着性子去解决,不要把问题留给以后。

并且,当我们在学习某一类知识的时候,假设有时间,能够多想想,涉及一下与其相关的知识。也许你会有意想不到的收获。


URL中增加BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)的更多相关文章

  1. java.net.MalformedURLException: Illegal character in URL

    在进行接口测试时,意外发现返回结果报java.net.MalformedURLException: Illegal character in URL,意思是“在URL中的非法字符”,我的参数是经过ba ...

  2. django删除表重建&修改用户密码&base64加密解密字符串&ps aux参数说明&各种Error例子

    1.django的queryset不支持负索引 AssertionError: Negative indexing is not supported. 2.django向前端JavaScript传递列 ...

  3. python中的base64加密解密

    介绍 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. ...

  4. android与php使用base64加密的字符串结果不一样解决方法

    base64将字符串转换为字节得到同一个值 一.错误 String signString = Base64.encodeToString(signContent.getBytes(),Base64.N ...

  5. 爬取数据时解析url时一直报错Caused by: java.net.URISyntaxException: Illegal character in query at index 823替换了所有空格和特殊字符还是无效

    近日在用HttpClient访问抓取汇率时,为了省力,直接采用 String url = "http://api.liqwei.com/currency/?exchange=usd|cny& ...

  6. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  7. .NET中进行Base64加密解密

    方法一: /// <summary> /// Base64加密 /// </summary> /// <param name="Message"> ...

  8. Java中使用BASE64加密&解密

    package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc ...

  9. Jmeter中实现base64加密

    Jmeter已不再提供内置base64加密函数,遇到base64加密需求,需要通过beanshell实现 直接上beanshell代码: import org.apache.commons.net.u ...

随机推荐

  1. Hadoop4Win

    Hadoop4Win + Eclipse 运行 WordCount 程序 http://software.intel.com/zh-cn/blogs/2013/10/16/hadoop4win-ecl ...

  2. WF编译报错

    最近在研究WF的时候,遇到了一个未知的错误,错误信息时这样的 错误 102 扩展“Microsoft.Activities.Build.Validation.ValidationBuildExtens ...

  3. poj 3661 Running(区间dp)

    Description The cows are trying to become better athletes, so Bessie ≤ N ≤ ,) minutes. During each m ...

  4. 解密yii中CModule::_components和CModule::_componentConfig

    array CModule::_components 所有组件对象(CComponent的子类)将作为键值存在该数组中, 键名是定义该组件时使用的键名.例如: protected function r ...

  5. nginx源代码分析--配置文件解析

    ngx-conf-parsing 对 Nginx 配置文件的一些认识: 配置指令具有作用域,分为全局作用域和使用 {} 创建其他作用域. 同一作用域的不同的配置指令没有先后顺序:同一作用域能否使用同样 ...

  6. D. DZY Loves Modification

    D. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  7. 【巧妙思维】【4-6】Problem F

    题意:有n个正方体,边长为A[i] 当A[k]-A[p]<=lim 时 k可以放在p上面, 问有多少种放法: 一开始被数据范围吓到了 ,以为是n^3算法,答案是nlogn 从小到大排序,一个一个 ...

  8. html系列教程--header head iframe img

    <head> 标签 用于定义文档的头部,它是所有头部元素的容器.<head> 中的元素可以引用脚本.指示浏览器在哪里找到样式表.提供元信息 head的描述信息包括<bas ...

  9. MSDN地址,记录下来,以防以后使用

    MSDN在线官网:https://msdn.microsoft.com/zh-cn/default.aspx 以备学习时候使用.

  10. NSThread 的用法

    一.线程的注意点: 1.不要同时开太多的线程(最多不要超过5条,其中包括主线程) 2.线程概念 2.1.主线程:UI 线程,显示.刷新 UI 界面,处理 UI 控件的事件 2.2.子线程:后台线程,异 ...