php调用java传递xml字符串乱码的解决办法:
这两个工作需要,给一个php同事提供java接口,参数内容:
<xml><tousername><![cdata[wxcc878e3a91463bb5]]></tousername><fromusername><![cdata[on2bf1j3nbtucfchovu-cnos1mxu]]></fromusername><createtime>1348831860</createtime><msgtype><![cdata[text]]></msgtype><content><![cdata[this is a test]]></content><msgid>1234567890123456</msgid><brandid><![cdata[5]]></brandid><hotelid><![cdata[5]]></hotelid></xml>
request header:
method:post。
由于客观原因,不能直接调用,所以自测接口时用的postman,接口调用一切正常。but,上线以后,测试时一直报
org.dom4j.documentexception: error on line 1 of document : 前言中不允许有内容。 nested exception: 前言中不允许有内容。
但是日志输出:
<xml><tousername><![cdata[wxcc878e3a91463bb5]]><\/tousername><fromusername><![cdata[on2bf1j3nbtucfchovu-cnos1mxu]]><\/fromusername><msgtype><![cdata[text]]><\/msgtype><content><![cdata[123]]><\/content><brandid><![cdata[5]]><\/brandid><hotelid><![cdata[5]]><\/hotelid><\/xml>
标签中多了转义字符\,使用正则替换:xml.replaceall("<\\\\/","</");,之后输出正常。
但是上面的异常信息还在。。。。。。
网上几乎一致的解决方案:用编辑器打开另存为,修改编码格式。程序怎么会这么搞!!!
在同事的协助下,使用curl 在命令行中请求:
curl -x post \ http://localhost:21010/wx_reply/reply2user \ -h 'cache-control: no-cache' \ -h 'content-type: application/xml' \ -h 'postman-token: 08ae772c-7891-aaa2-01ef-30dccf5ffac0' \ -d '<xml><tousername><![cdata[wxcc878e3a91463bb5]]></tousername><fromusername><![cdata[on2bf1j3nbtucfchovu-cnos1mxu]]></fromusername><createtime>1348831860</createtime><msgtype><![cdata[text]]></msgtype><content><![cdata[this is a test]]></content><msgid>1234567890123456</msgid><brandid><![cdata[5]]></brandid><hotelid><![cdata[5]]></hotelid></xml>'
发现参数实际是:
%3cxml%3e%0a%3ctousername%3e%3c%21%5bcdata%5bwxcc878e3a91463bb5%5d%5d%3e%3c%2ftousername%3e%0a%3cfromusername%3e%3c%21%5bcdata%5bon2bf1j3nbtucfchovu-cnos1mxu%5d%5d%3e%3c%2ffromusername%3e%0a%3ccreatetime%3e1348831860%3c%2fcreatetime%3e%0a%3cmsgtype%3e%3c%21%5bcdata%5btext%5d%5d%3e%3c%2fmsgtype%3e%0a%3ccontent%3e%3c%21%5bcdata%5bthis+is+a+test%5d%5d%3e%3c%2fcontent%3e%0a%3cmsgid%3e1234567890123456%3c%2fmsgid%3e%0a%3cbrandid%3e%3c%21%5bcdata%5b5%5d%5d%3e%3c%2fbrandid%3e%0a%3chotelid%3e%3c%21%5bcdata%5b5%5d%5d%3e%3c%2fhotelid%3e%0a%3c%2fxml%3e=
也就是说:
spring对request中body的内容进行了encode。使用urldecode.decode(xml后得到了正常的内容,但发现参数后面多了一个=(看上面的参数)。
最终检查发现:是php同事调用接口时的content-type:application/json,改成application/xml后,问题解决了。
想了解更多编程学习,敬请关注php培训栏目!
以上就是php调用java传递xml字符串乱码怎么办的详细内容。
