>  기사  >  백엔드 개발  >  PHP가 잘못된 XML 문자열을 전달하기 위해 Java를 호출하는 경우 어떻게 해야 합니까?

PHP가 잘못된 XML 문자열을 전달하기 위해 Java를 호출하는 경우 어떻게 해야 합니까?

coldplay.xixi
coldplay.xixi원래의
2020-09-30 09:15:262362검색

잘못된 xml 문자열을 전달하기 위해 java를 호출하는 PHP에 대한 솔루션: 먼저 CURL을 사용하여 명령줄에서 요청을 완료한 다음 인터페이스를 [application/xml]로 호출할 때 [Content-Type: application/json]을 변경합니다.

PHP가 잘못된 XML 문자열을 전달하기 위해 Java를 호출하는 경우 어떻게 해야 합니까?

잘못된 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

하지만 위의 예외 메시지가 여전히 남아 있습니다. . . . . .

인터넷의 솔루션과 거의 동일합니다. 편집기를 사용하여 다른 이름으로 저장 파일을 열고 인코딩 형식을 수정하세요. 프로그램이 어떻게 이런 일을 할 수 있겠는가! ! ! 동료들의 도움으로 CURL을 사용하여
rrreee

를 요청했고 매개변수가 실제로
rrreee🎜임을 확인했습니다. 즉, 🎜🎜spring은 요청의 본문 내용을 인코딩합니다. URLDecode.decode(xml)를 사용한 후 정상적인 내용을 얻었으나 매개변수 뒤에 추가 =가 있는 것을 발견했습니다(위 매개변수 참조). 🎜🎜최종 검사 발견: php입니다. 동료가 인터페이스를 호출했을 때 Content-Type:application/jsonapplication/xml로 변경했고 문제가 해결되었습니다. 🎜🎜🎜If 프로그래밍에 대해 더 자세히 알고 싶으시면 🎜php training🎜 칼럼 🎜🎜🎜을 팔로우하세요.

위 내용은 PHP가 잘못된 XML 문자열을 전달하기 위해 Java를 호출하는 경우 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.