Java を呼び出すときに php によって渡される文字化けした XML 文字列の解決策: まず CURL を使用してコマンド ラインでリクエストを完了し、次にインターフェイスを呼び出すときに [Content-Type: application/json] を [application] に変更します。 /xml] 以上です。
PHP が Java を呼び出して文字化けした XML 文字列を渡す問題の解決策:
これら 2 つのジョブが必要です。1 つの 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>
リクエスト ヘッダー:
メソッド:POST を提供しています。
客観的な理由により、直接呼び出すことができないため、インターフェイスの自己テスト時に postman が使用され、インターフェイスの呼び出し時にはすべてが正常です。しかし、オンラインにした後、
org.dom4j.DocumentException: テスト中にドキュメントの 1 行目のエラーが報告されました: 序文ではコンテンツは許可されません。ネストされた例外: 序文にコンテンツは許可されません。
ただし、ログ出力:
<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 リクエストの本文の内容はエンコードされます。 URLDecode.decode(xml
を使用すると、通常のコンテンツが得られましたが、パラメーターの後に余分な =
があることがわかりました (上記のパラメーターを参照)。
最終検査で判明: 私の php 同僚がインターフェイスを呼び出したとき、Content-Type:application/json
でした。それを application/xml
に変更した後、問題は解決しました。
もっと知りたい もっとプログラミングを学びたい方は、php training のコラムにご注目ください!
以上がPHP が Java を呼び出して文字化けした XML 文字列を渡す場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。