前几天,因为项目要求,需要用Java程序模拟HTTP请求。接收的服务端是用SpringMVC来写的,是通过参数对象映射将属性自动填充。一开始还是比较顺利的,也顺利地将数据发了出去,可最后检查的时候发现,有一部分的数据并没有完全接受到。
如图:
通过Debug方式得到的详情,发现,其他的属性都是完好的填充起来了,但是只有这个infoCPU的属性还没有自动填充。
我在Java程序中是传递一个Map,Map中的值都是一些JSON字符串,一开始以为只是Java程序的问题,但是仔细想想,其他数据都是没有问题的,说明问题的所在并不在Java程序这一端。
然后,想想会不会是JSON数据的问题,也就是infoCPU这一个JSON数据的问题。我试了试:
map.put("infoCPU", "infoCPU");
Debug一下之后发现:
数据是有的!!!!!
这下,问题就清楚多了,关键在于这一段的JSON。
这时我想到,会不会有报错的Log。一看发现还真的有,报错的日志是这么写的:
Character decoding failed. Parameter [infoCPU] with value [...] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values.
这个错误就更加让我明确,问题就是在JSON当中。这个错误是说,字符转码失败,导致被SpringMVC给无视掉了,所以这个属性自然就是null。
于是接着看了看我这段JSON:
{
"infoCPUDetails": [
{
"mhz": 1796,
"vendor": "Intel",
"model": "Core(TM) i5-3337U CPU @ 1.80GHz",
"cacheCount": -1,
"userRadio": "21.9%",
"systemRadio": "0.0%",
"waitRadio": "0.0%",
"errorRadio": "0.0%",
"freeRadio": "78.0%",
"totalUse": "21.9%"
}
]
}
...
其余的JSON数据就不展示了。
一开始还没有看到,看了好久才发现:(不过机智的各位看了我的标题应该也知道问题的所在了吧)
%
问题的关键就在这里,我赶紧将%全部替换掉
.replaceAll("%","");
再次Debug,如图:
这些终于有数据啦,(^__^) 嘻嘻……
对于%,一般来说,是用在URL中对于字符的一个替换,指定特殊字符,比较常见的就是%20,在现实中是空格的意思。在上面的JSON数据中,因为存在百分数,自然就存在%。正是因为这个的存在才会影响转码之后无法被SpringMVC所接收。
关于网络传输中编码与转码的关系,大家可以参考这篇文章:
http://blog.youkuaiyun.com/zhh521125/article/details/6627245
这是我在项目中遇到的一个小插曲,虽然事后觉得没什么的,但是我觉得,耐心地发现问题,寻找问题,解决问题的思路还是值得深思的,与大家共勉。
有什么想法的都欢迎来留言~(≧▽≦)/~