Envoi et reception de fichier XML sur un serveur

Signaler
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011
-
Messages postés
2
Date d'inscription
lundi 31 mai 2010
Statut
Membre
Dernière intervention
6 juin 2012
-
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

Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011

quelle est la méthode la plus simple et comment la mettre en place?
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011

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?
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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
Messages postés
99
Date d'inscription
mardi 25 août 2009
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
A ton service.

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


Grrrrrrrrrrr
Messages postés
2
Date d'inscription
lundi 31 mai 2010
Statut
Membre
Dernière intervention
6 juin 2012

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