Aide - Recherche - Membres - Calendrier
Version complète : http POST sans formulaire (envoi/réception)
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
Lloyd
Bonjour,

Dans le développement d'un site, je dois récupérer un fichier XML que l'on m'envoie depuis un autre serveur par http POST.

J'ai d'abord pensé que je pouvais simplement récupérer le fichier dans une variable $_FILES, mais non, ça ne fonctionne pas. Dans mon raisonnement, j'utilisais la fonction move_uploaded_files pour enregistrer le fichier sur le serveur (cela fonctionne avec un formulaire normal).

Ce qui me pose le plus de problème, c'est que je dois à chaque fois appeler le développeur de l'autre site pour que l'on puisse faire un test, alors que j'ai l'impression de tout comprendre de travers. Alors ma première question est la suivante:
Existe-t-il un moyen simple d'envoyer un fichier XML par http POST avec PHP afin que je puisse tester en interne?

Ma deuxième question est tout aussi générale: Sous quelle forme le fichier arrive-t-il à la cible et comment le récupérer pour l'enregistrer?

Je serai reconnaissant pour toute forme d'aide! Et malheureusement, comme de bien entendu, ce projet devrait être terminé à la fin de la semaine...

Merci beaucoup!

Lloyd
neolao
oui, regarde l'exemple : http://fr.php.net/manual/fr/function.strea...text-create.php

tu peux créer un context POST

le context peut être utilisé dans file_get_contents aussi http://fr.php.net/file_get_contents
Lloyd
Ok, j'étais donc dans la fausse direction! Merci pour cette réponse! Je dois donc chercher dans les "contextes"?!... Mais je suis pas sûr de bien comprendre la marche à suivre.
Je doit créer le contexte avec

PHP

$opts = array(
'http'=>array(
'method'=>"POST",
'header'=> "Content-type: text/xml\r\n" .
"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n",
'content'=> file_get_contents("fichier.xml")
)
);

$context = stream_context_create($opts);
et ensuite faire

PHP

file_get_contents('http://www.site.com/macible.php', false, $context)

Pour envoyer mon fichier XML?

Désolé, ça doit vous paraître bête, je trouve les infos sur les fonctions séparément, mais je comprends pas le principe...

merci encore...
t-servi
Salut,
Est-ce que ton formulaire contient le type d'encryption ( enctype )?

PHP


<form enctype="multipart/form-data" method="post" action="action.php">

Meilleures salutations.
Jean Tinguely Awais.
Lloyd
Citation (t-servi.com @ Sep 3 2008, 07:55 AM) *
Salut,
Est-ce que ton formulaire contient le type d'encryption ( enctype )?

PHP


<form enctype="multipart/form-data" method="post" action="action.php">

Meilleures salutations.
Jean Tinguely Awais.

En fait, dans mon formulaire original, oui, mais là je tente de faire ça SANS formulaire justement...
t-servi
Salut,
Est-ce que la personne qui t'envoie le fichier passe par une requête http?
Meilleures salutations.
Jean Tinguely Awais.
Lloyd
Citation (t-servi.com @ Sep 3 2008, 01:36 PM) *
Salut,
Est-ce que la personne qui t'envoie le fichier passe par une requête http?
Meilleures salutations.
Jean Tinguely Awais.

Hello,

La personne qui m'envoie les fichier utilise ce qu'il appelle "http POST", et ce n'est pas un formulaire, c'est un processus, de son coté, qui lui permet d'envoyer la même info (le fichier xml) à plusieurs serveurs différent en une seule opération... Donc, je suppose que c'est une requête http. (Il n'utilise pas PHP)

Je lui ai demandé sous quelle forme je recevais les informations (je pensais pouvoir récupérer un $_FILES comme depuis un formulaire) et il m'a répondu "Nous envoyons une plain page (une variable, si vous voulez) avec content type «text/xml»." ...

Un autre problème s'ajoute à cela, dès que l'on fait un test, son interface lui retourne une erreur 403 (de la part de mon serveur)... Le CHMOD de mon fichier est à 777. La configuration de mon serveur pour allow_url_fopen => Off, pour Registered Classes il y a entre autres HttpRequest, HttpRequestPool, HttpRequestDataShare, HttpDeflateStream, HttpInflateStream, HttpResponse, HttpQueryString... Je ne sais pas si ça peut vous aider!?...

C'est un procédé qui est rarement utilisé ou quoi? Il n'y a que très peu d'infos sur la toile à ce sujet!

Merci pour vos réponses! ça me fait déjà avancer un peu!
t-servi
Salut,
Pour l'erreur 403, peux-tu essayer de mettre le fichier en "chmod 755" et tester si il te retourne une erreur?
Meilleures salutations.
Jean Tinguely Awais.
Lloyd
Citation (t-servi.com @ Sep 3 2008, 02:51 PM) *
Salut,
Pour l'erreur 403, peux-tu essayer de mettre le fichier en "chmod 755" et tester si il te retourne une erreur?
Meilleures salutations.
Jean Tinguely Awais.

Voilà, alors j'ai essayé en 755 et ça ne change rien (et mon fichier est à la racine du site)...

Est-ce que le problème pourrait être dans la configuration du serveur?
t-servi
Salut,
Est-ce que tu travaille avec apache ou IIS?
Est-ce que tu peux faire un répertoire et charger ton fichier à l'intérieur du répertoire?
Meilleures salutations.
Jean Tinguely Awais.
Lloyd
Citation (t-servi.com @ Sep 4 2008, 04:16 PM) *
Salut,
Est-ce que tu travaille avec apache ou IIS?
Est-ce que tu peux faire un répertoire et charger ton fichier à l'intérieur du répertoire?
Meilleures salutations.
Jean Tinguely Awais.

Apache.

En interne, je peux faire tout ce que je veux, copier, insérer, nouveau fichier... N'importe quoi! et ce qui me perturbe, c'est justement que je PEUX enregistrer un fichier quand il vient d'un formulaire (d'un autre serveur) en POST, mais quand le technicien fait SON http post, ça lui rend cette erreur... Je n'y comprends rien...

Merci de m'aider...
Lloyd
Bonjour,

J'ai changé de serveur et maintenant ça marche... Je n'ai donc toujours pas la solution mais ce doit être une configuration du serveur...

Autre problème, je ne sais pas comment récupérer les données envoyées... J'ai parsé les globales $_POST, $_FILES et $_REQUEST, mais je n'obtient aucun résultat!... Auriez-vous une idée?

Merci beaucoup...
Antoine
Je ne comprends toujours pas ce que tu veux faire.

Si tu veux récuperer un fichier XML que l'on t'envoie en post, tu n'as pas de contexte à créer. Juste t'occuper de tes variables POST et FILE éventuellement. Par exemple (get et post)

PHP

<?php

echo "Get successfull\n";
var_dump($_GET);
echo "\n";

?>

PHP

<?php

echo "Post successfull\n";
var_dump($_POST);
echo "\n";

?>


Si tu veux faire une requête POST vers un serveur alors il faut un contexte.

PHP

<?php

echo "<pre>";

$data = http_build_query(
array('First' => 'Ok', 'Second' => 'Ok 2')
);

/* Do a ''get'' query */

$opts = array(
'http'=>array(
'method'=>"GET",
'header' => "Accept-language: en\r\n"
)
);

$context = stream_context_create($opts);

$fp = fopen('http://localhost/php/get.php?'.$data, 'r', false, $context);
fpassthru($fp);
fclose($fp);

echo "\n\n";

/* Do a ''post'' query */

$opts = array(
'http' => array(
'method' => "POST",
'header' => "Accept-language: en\r\n".
"Content-type: application/x-www-form-urlencoded\r\n".
"Content-Length: ".strlen($data)."\r\n",
'content' => $data
)
);

$context = stream_context_create($opts);

$fp = fopen('http://localhost/php/post.php', 'r', false, $context);
fpassthru($fp);
fclose($fp);

echo "</pre>";

?>

Pour l'envoi d'un fichier, on change un peu le content-type pour qu'il corresponde (en POST)
t-servi
Salut,
Est-ce qu'il te retourne un fichier xml? Est-ce que ce fichier est sauvegardé sur ton serveur?
Meilleures salutations.
Jean Tinguely Awais.
Lloyd
Merci pour le code, je vais tester ça (pour l'envoi).

En fait, ce que je dois réellement faire, c'est recevoir un fichier, mais je voulais savoir comment envoyer pour pouvoir faire des tests!

Ce qui est étrange avec le test de l'autre serveur (qui m'envoie un fichier XML), c'est que ni $_GET, ni $_POST, ni $_FILES ne contient quelque chose...

Je vous tiendrai au courant, merci...
Antoine
Peut-être peux-t-on avoir accès au serveur pour également faire des tests et ainsi mieux te guider.
Lloyd
Citation (Antoine @ Sep 8 2008, 11:35 AM) *
Peut-être peux-t-on avoir accès au serveur pour également faire des tests et ainsi mieux te guider.

Malheureusement pas, je n0ai pas accès moi-même au serveur qui envoie... Justement, il faut aussi que je recrée cet environnement pour le tester mais quand on ne connait pas exactement la manière (ce qui est notre cas), c'est pas facile...
Lloyd
Bonjour!

Pour information (pet-être que ça pourrait servir à certains), la seule manière que j'ai trouvé pour récupérer des données d'un http POST est de récupérer la variable POST brute comme suit:

PHP

file_get_contents('php://input');

On peut ensuite l'enregistrer dans un fichier en faisant un truc du style:

PHP

$contenu = file_get_contents('php://input');
$fichier = "data/fichier.xml";

$fd = @fopen ($fichier, "w");
if ($fd) {
//write content
fwrite($fd,$contenu);
fclose($fd);

}


Voilà... Merci pour votre aide!
neolao
oups, désolé de n'avoir pas suivi le topic, je t'aurai dit cette solution du php://input
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.