잘못된 xml 문자열을 전달하기 위해 java를 호출하는 PHP에 대한 솔루션: 먼저 CURL을 사용하여 명령줄에서 요청을 완료한 다음 인터페이스를 [application/xml]로 호출할 때 [Content-Type: application/json]을 변경합니다.
잘못된 xml 문자열을 전달하기 위해 java를 호출하는 PHP 솔루션:
이 두 작업에서는 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>
요청 헤더:
method:POST .
객관적인 이유로 직접 호출할 수 없기 때문에 인터페이스를 자체 테스트할 때는 postman을 사용하고, 인터페이스를 호출할 때는 모든 것이 정상입니다. 하지만 온라인에 접속한 후에도 계속해서
org.dom4j.DocumentException: Error on line 1 of document while test: No content is allowed in the preface를 보고했습니다. 중첩된 예외: 서문에는 내용이 허용되지 않습니다.
그러나 로그 출력은 다음과 같습니다.
<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("<\\/","</" );
이면 출력이 정상입니다. ,使用正则替换:
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
rrreee🎜임을 확인했습니다. 즉, 🎜🎜spring은 요청의 본문 내용을 인코딩합니다.인터넷의 솔루션과 거의 동일합니다. 편집기를 사용하여 다른 이름으로 저장 파일을 열고 인코딩 형식을 수정하세요. 프로그램이 어떻게 이런 일을 할 수 있겠는가! ! ! 동료들의 도움으로 CURL을 사용하여
를 요청했고 매개변수가 실제로
rrreee
URLDecode.decode(xml
)를 사용한 후 정상적인 내용을 얻었으나 매개변수 뒤에 추가 =
가 있는 것을 발견했습니다(위 매개변수 참조). 🎜🎜최종 검사 발견: php입니다. 동료가 인터페이스를 호출했을 때 Content-Type:application/json
을 application/xml
로 변경했고 문제가 해결되었습니다. 🎜🎜🎜If 프로그래밍에 대해 더 자세히 알고 싶으시면 🎜php training🎜 칼럼 🎜🎜🎜을 팔로우하세요.위 내용은 PHP가 잘못된 XML 문자열을 전달하기 위해 Java를 호출하는 경우 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!