Envoi et reception de fichier XML sur un serveur

j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011 - 22 févr. 2010 à 14:34
mayalali Messages postés 2 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 6 juin 2012 - 6 juin 2012 à 16:13
Bonjour à tous,

je dois envoyer un fichier XML sur un serveur distant en HTTP/POST, en focntion de la réponse du serveur je dois répondre un autre fichier XML.
Mon problème c'est que je sais absolument pas comment faire... Quelqu'un a une idée?

Merci d'avance

10 réponses

gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
22 févr. 2010 à 22:21
Bonjour,

Pour envoyer ton fichier XML en post, tu peux utiliser la bibliothèque httpClient qui fonctionne très bien (http://scripts.incutio.com/httpclient/). Vois sur le site pour savoir comment l'utiliser, ce n'est pas bien compliqué mais tu peux poser tes questions ici si tu as des problèmes.

Est-ce que ça répond à ta question ?


Grrrrrrrrrrr
0
j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011
23 févr. 2010 à 10:24
je sais pas quoi mettre dans post:
$client = new HttpClient('ws-test.truc.com/');
$client->setDebug(true);
if (!$client->post(???)) //quoi mettre dedans pour envoyer mon fichier XML
{ 
    echo 'Request failed!

';
} else {
    echo ' '.strlen($client->getContent()).' bytes.

';
}


et je comprend pas comment faire pour récupérer le fichier que le serveur va me renvoyer.

si tu peux m'aider, se serai sympa
0
j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011
23 févr. 2010 à 10:30
sinon je viens d'essayer:
function do_post_request($url, $data, $optional_headers = null)
{
 $params array('http'> array(
  'method' => 'POST',
  'content' => $data
   ));
 if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
 }
 $ctx = stream_context_create($params);
 $fp = @fopen($url, 'rb', false, $ctx);
 if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
 }
 $response = @stream_get_contents($fp);
 if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
 }
 return $response;
} 

echo do_post_request('ws-test.truc.com/','XML/Vidage_CRLF.cml');


et j'ai en msg d'erreur:
Fatal error: Uncaught exception 'Exception' with message 'Problem with ws-test.truc.com/, ' in D:\www\diagdirect\client.php:169 Stack trace: #0 D:\www\diagdirect\client.php(178): do_post_request('ws-test.truc.co...', 'XML/Vidage_CRLF...') #1 {main} thrown in D:\www\diagdirect\client.php on line 169

et
Fatal error: Uncaught exception 'Exception' with message 'Problem reading data from ws-test.truc.com/, ' in D:\www\diagdirect\client.php:173 Stack trace: #0 D:\www\diagdirect\client.php(178): do_post_request('ws-test.truc.co...', 'XML/Vidage_CRLF...') #1 {main} thrown in D:\www\diagdirect\client.php on line 173
0
j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011
23 févr. 2010 à 10:31
quelle est la méthode la plus simple et comment la mettre en place?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
24 févr. 2010 à 20:38
Bonjour,

Désolé pour la réponse tardive, je n'avais pas vu tes messages.

Pour utiliser HttpClient, c'est pas compliqué :

1) Créer une instance de l'objet en lui passant en paramètre le serveur et optionnellement le port. Pour le port, si tu veux faire une requête https tu devra le modifier, par défaut c'est le port 80.

2) Appeler la fonction post() comme tu l'as fait. Le premier paramètre est le chemin du fichier à appeller sur le serveur (l'url sans le nom de domaine). Le second paramètre est un tableau qui représente les paramètres à passer en post (les clés sont les nom des variables et les valeurs sont les valeurs à passer).

3) Contrôler que tout s'est bien passer. Si on reçoit un code 200 tout va bien, sinon c'est une erreur. La fonction getStatus() retourne le code.

4) Lire ce qui a été renvoyé par le serveur avec la fonction getContent(). Dans ton cas, je suppose que le webservice que tu veux appeler enverra directement le XML. Tu n'as donc qu'à lire le retour.


Un petit exemple pour que tu vois comment faire :

<?php

require_once('HttpClient.class.php');

$xml = '<?xml version="1.0" encoding="UTF-8"?><root><element>Test</element></root>';

$client = new HttpClient('localhost');

$client->setDebug(true);

$client->post('/tests/formulaire.php',array('xml'=>urlencode($xml)));

if(200 == $client->getStatus()){
echo 'XML Reçu du serveur :

<xmp>'.$client->getContent().'</xmp>';
}
else{
echo 'erreur de réception du XML : '.$client->getStatus().' ('.$client->getError().')';
}

?>




Grrrrrrrrrrr
0
j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011
1 mars 2010 à 15:06
salut
désolé pour le retard malade
je viens d'essayé ton truc mais marche pas, j'ai toujours:
j'ai une erreur 400

voila mon morceau de code:

Code PHP :$xml = new SimpleXMLElement('XML/Vidage_CRLF.xml',NULL,true);
$client = new HttpClient(ip_serveur/');
$client->setDebug(true);
if (!$client->post('index.php',$xml)) {
echo 'Request failed!

';
} else {
echo ' '.strlen($client->getContent()).' bytes.

';
}
if(200 == $client->getStatus()){
echo 'XML Reçu du serveur :

<xmp>'.$client->getContent().'</xmp>';
}
else{
echo 'erreur de réception du XML : '.$client->getStatus().' ('.$client->getError().')';
}


le serveur sur lequel je dois envoyer le fichier à le message suivant sur ça page d'acceuil:

Under Construction
The site you were trying to reach does not currently have a default page. It may be in the process of being upgraded.
--------------------------------------------------------------------------------
Please try this site again later. If you still experience the problem, try contacting the Web site administrator.

une idéee?
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
1 mars 2010 à 18:28
Bonjour,

Je vois plusieurs problèmes dans ton code.

Tout d'abord, pourquoi utiliser SimpleXMLElement alors que ce n'est pas utile ? Du XML peut très bien être utilisé sous forme de texte. La fonction file_get_content() ferait tout aussi bien l'affaire.

Ensuite tu appelles la fonction post() avec un objet SimpleXMLElement comme 2eme paramètre. Dans l'exemple que j'ai donné, je t'ai montré qu'il fallait un tableau (voir point 2 de mon message précédent). Attention toutefois, ce paramètre ne s'appelle pas forcement 'xml', vois avec le fournisseur du webservice si c'est bien ça.

Troisième point, tu testes la réussite ou l'échec de la fonction post() (ce qui est très bien) mais tu essaye ensuite d'avoir le code même si post() n'a pas marchée. Ton test sur le code 200 devrait se faire dans le 1er if.

Enfin, le fait que le serveur affiche un message d'erreur n'est pas forcément une mauvaise nouvelle : il se peut qu'il s'affiche si aucun XML n'est passé par exemple. Mais ici, vu le message, es-tu certain que le service existe bel et bien et que l'url est bonne ?

Est ce que tu as une documentation du service que tu veux utiliser ? Ca serait plus simple avec ça.



Grrrrrrrrrrr
0
j3r3m067 Messages postés 99 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 28 juin 2011
2 mars 2010 à 11:55
je viens de contacter le fournisseur du webservice, concernant le message d'erreur et le code retour 400, il m'a dis que pour le moment le service n'est pas accessible en externe pour le moment.

pour la doc, j'ai rien qui explique le fonctionnement de mon "serveur de post", la seul donc que j'ai me dis comment fonctionne les différents XML que j'envoie ou que je receptionne.

je vais donc attendre que le serveur soit opérationnel pour l'exterieure et je reposterai si besoin merci
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010 1
2 mars 2010 à 20:24
A ton service.

N'hésite pas si tu as des problèmes quand ça fonctionne.


Grrrrrrrrrrr
0
mayalali Messages postés 2 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 6 juin 2012
6 juin 2012 à 16:13
Bonjour,
moi c'est pas en post que je veux recuperer le flux xml, car c'est un flux xml simple et pas un web service,
je veux recuperer le flux par GET mais je ne sais pas comment,
ils m'ont dis qu'il faut faire ça:

<http://adresse_flux.com/?xml=<?xml version="1.0" encoding="UTF-8"?>
<REQUETE>
........
</REQUETE>
en faite ma question c'est comment concaténer la chaine xml à parser avec l'adresse de flux à l'aide d'un point d'interrogation en php
j'ai beau cherché sur le net sur la façon de récupérer le flux xml par GET et j'ai pas trouvé
je vous serais très reconnaissante de m'aider,
merci à l'avance
0