Question

J'essaie de POST sur le serveur d'un fournisseur en utilisant PHP 5.2 avec cURL.Je lis un document XML à publier sur leur serveur, puis je lis une réponse :

$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE);  # Have also tried leaving this out
$response = curl_exec($curlHandle);

Ce code, en soi, fonctionne correctement, mais l'autre serveur renvoie une réponse de son analyseur XML indiquant :

Contenu non autorisé dans le prologue

J'ai recherché cette erreur et cela est normalement causé par des espaces avant le XML, mais je me suis assuré que le fichier XML lui-même n'a pas d'espace et que trim() devrait de toute façon clarifier cela.J'ai fait un TCPDump sur la connexion pendant que j'exécutais le code et voici ce qui est envoyé :

POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f

---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"

[SNIP - the XML was displayed]

---------------------------01e7cda3896f--

Avant et après la ligne [SNIP], il y a un espace visible lorsque je rejoue la session dans Ethereal.Est-ce la cause du problème et, si oui, comment puis-je le supprimer, ou est-ce que je cherche trop loin et cela peut être un problème avec le serveur sur lequel je publie ?

Était-ce utile?

La solution 2

Il s'avère que c'est un problème d'encodage.L'application a apparemment besoin du XML dans www-form-urlencoded au lieu des données de formulaire, j'ai donc dû changer :

# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));

à

# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));

Autres conseils

Pas une réponse, mais je trouve l'ensemble fopen/fread/fclose très ennuyeux à parcourir lorsque l'on regarde le code.

Vous pouvez remplacer :

$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);

Avec:

$request = trim(file_get_contents('test.xml'));

Mais quoi qu’il en soit – à votre question ;si ce sont les en-têtes qui sont envoyés, cela ne devrait pas poser de problème avec le serveur distant.Essayez de modifier le contenu de votre fichier XML et d'utiliser var_dump() pour vérifier la sortie exacte (y compris la longueur de la chaîne, afin que vous puissiez rechercher les éléments manquants).

J'espère que cela pourra aider

j'ai fait un wc -m test.xml et est revenu avec 743 caractères dans le fichier XML et le var_dump sur $request revient avec 742 caractères donc quelque chose est supprimé trim() (Je suppose).

J'ai fait un:

print "=====" . $request . "=====";

et le début et la fin du XML se heurtent au ===== sans espace blanc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top