ホームページ  >  記事  >  バックエンド開発  >  PHP が Java を呼び出して文字化けした XML 文字列を渡す場合はどうすればよいですか?

PHP が Java を呼び出して文字化けした XML 文字列を渡す場合はどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-09-30 09:15:262362ブラウズ

Java を呼び出すときに php によって渡される文字化けした XML 文字列の解決策: まず CURL を使用してコマンド ラインでリクエストを完了し、次にインターフェイスを呼び出すときに [Content-Type: application/json] を [application] に変更します。 /xml] 以上です。

PHP が Java を呼び出して文字化けした 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。