Envoi et reception de fichier XML sur un serveur

j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 22 févr. 2010 à 14:34 - Dernière réponse : mayalali 2 Messages postés lundi 31 mai 2010Date d'inscription 6 juin 2012 Dernière intervention
- 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
Afficher la suite 

10 réponses

Répondre au sujet
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 22 févr. 2010 à 22:21
0
Utile
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
Commenter la réponse de gibozsec
j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 23 févr. 2010 à 10:24
0
Utile
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
Commenter la réponse de j3r3m067
j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 23 févr. 2010 à 10:30
0
Utile
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
Commenter la réponse de j3r3m067
j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 23 févr. 2010 à 10:31
0
Utile
quelle est la méthode la plus simple et comment la mettre en place?
Commenter la réponse de j3r3m067
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 24 févr. 2010 à 20:38
0
Utile
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
Commenter la réponse de gibozsec
j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 1 mars 2010 à 15:06
0
Utile
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?
Commenter la réponse de j3r3m067
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 1 mars 2010 à 18:28
0
Utile
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
Commenter la réponse de gibozsec
j3r3m067 99 Messages postés mardi 25 août 2009Date d'inscription 28 juin 2011 Dernière intervention - 2 mars 2010 à 11:55
0
Utile
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
Commenter la réponse de j3r3m067
gibozsec 318 Messages postés mardi 27 mai 2003Date d'inscription 11 mars 2010 Dernière intervention - 2 mars 2010 à 20:24
0
Utile
A ton service.

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


Grrrrrrrrrrr
Commenter la réponse de gibozsec
mayalali 2 Messages postés lundi 31 mai 2010Date d'inscription 6 juin 2012 Dernière intervention - 6 juin 2012 à 16:13
0
Utile
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
Commenter la réponse de mayalali

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.