2008-08-20 11 views
4

Je tente de POST contre le serveur d'un fournisseur en utilisant PHP 5.2 avec cURL. Je lis dans un document XML pour poster sur leur serveur, puis la lecture dans une réponse:cURL ajouter des espaces pour poster du contenu?

$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, dans un lui-même, fonctionne bien, mais l'autre serveur renvoie une réponse à partir de son analyseur XML indiquant :

contenu non autorisé dans Prolog

Je regardai que jusqu'à d'erreur et cela est normalement causée par un espace avant le XML, mais je me suis assuré que le fichier XML lui-même n'a pas d'espace et la garniture () devrait éclaircir cela de toute façon. Je l'ai fait une TCPDump sur la connexion alors que je courais 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 [SNIP] ligne il y a des espaces visibles lorsque je rejoue la session Ethereal. Est-ce que c'est ce qui cause le problème et, si oui, comment puis-je le supprimer, ou est-ce que je regarde trop loin et cela peut être un problème avec le serveur contre lequel je post?

Répondre

2

Il s'avère que c'est un problème d'encodage. L'application a besoin apparemment XML www-form-urlencoded au lieu de forme de données donc je devais 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)); 
+0

assurez-vous juste que vous utilisez: curl_setopt ($ curlHandle, CURLOPT_HTTPHEADER, Array ("Content-Type: application/x-www-form-urlencoded; charset = utf-8")); –

3

Pas une réponse, mais je trouve l'ensemble fopen/fread/fclose chose très terne à parcourir lors de l'examen du 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 de toute façon - à 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 changer le contenu de votre fichier xml et en utilisant var_dump() pour vérifier la sortie exacte (y compris la longueur de chaîne, de sorte que vous pouvez chercher des choses manquantes)

espoir qui aide

0

Je l'ai fait une wc -m test.xml et je suis revenu avec 743 caractères dans le fichier XML et le var_dump sur $request revient avec 742 caractères, donc quelque chose est dépouillé avec trim() (je suppose).

J'ai fait un:

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

et le début et la fin des mégots XML droit contre le ===== sans espace blanc.