Maison > Article > développement back-end > Que dois-je faire si php appelle Java pour transmettre une chaîne XML tronquée ?
La solution à la chaîne XML tronquée transmise par php lors de l'appel de java : utilisez d'abord CURL pour terminer la requête dans la ligne de commande ; puis modifiez [Content-Type : application/json] lors de l'appel de l'interface en [application /xml] C'est tout.
Solution pour que PHP appelle Java pour transmettre une chaîne XML tronquée :
Ces deux tâches en nécessitent une. interface java, contenu du paramètre :
<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>
en-tête de requête :
méthode :POST.
Pour des raisons objectives, il ne peut pas être appelé directement, donc postman est utilisé lors de l'auto-test de l'interface, et tout est normal lors de l'appel de l'interface. MAIS, après être allé en ligne,
org.dom4j.DocumentException : Erreur sur la ligne 1 du document : Aucun contenu n'est autorisé dans la préface. Exception imbriquée : aucun contenu n'est autorisé dans la préface.
Mais la sortie du journal :
<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>
Il y a des caractères d'échappement supplémentaires dans la balise, utilisez le remplacement régulier :
xml.replaceAll("<\/","</");
, puis la sortie est normale.
Mais le message d'exception ci-dessus est toujours là. . . . . .
Presque la même solution sur Internet : ouvrir la sauvegarde comme avec un éditeur et modifier le format d'encodage. Comment le programme a-t-il pu faire ça ! ! !
Avec l'aide de collègues, utilisez CURL pour demander :
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>'
et constatez que le paramètre est en réalité :
%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=
En d'autres termes :
spring Le contenu du corps de la requête est codé. Après avoir utilisé URLDecode.decode(xml
, j'ai obtenu le contenu normal, mais j'ai constaté qu'il y avait un =
supplémentaire après le paramètre (voir les paramètres ci-dessus).
L'inspection finale a révélé que c'était Content-Type:application/json
lorsque le collègue PHP a appelé l'interface. Après l'avoir changé en application/xml
, le problème a été résolu.
Si vous souhaitez en savoir plus sur la programmation, faites attention à la rubrique Formation php !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!