cURL aggiungendo spazi bianchi per pubblicare contenuti?
Domanda
Sto tentando di eseguire il POST sul server di un fornitore utilizzando PHP 5.2 con cURL.Sto leggendo un documento XML da pubblicare sul loro server e poi leggo una risposta:
$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);
Quel codice, di per sé, funziona bene, ma l'altro server restituisce una risposta dal suo parser XML affermando:
Contenuto non consentito in Prolog
Ho cercato l'errore e questo è normalmente causato dagli spazi bianchi prima dell'XML, ma mi sono assicurato che il file XML stesso non avesse spazi bianchi e trim() dovrebbe comunque risolverlo.Ho eseguito un TCPDump sulla connessione mentre eseguivo il codice e questo è ciò che viene inviato:
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--
Prima e dopo la riga [SNIP] è visibile uno spazio bianco quando riproduco la sessione in Ethereal.È questo che sta causando il problema e, in tal caso, come posso rimuoverlo oppure sto guardando troppo lontano e potrebbe trattarsi di un problema con il server su cui sto postando?
Soluzione 2
Si scopre che è un problema di codifica.Apparentemente l'app necessita dell'XML in www-form-urlencoded anziché in form-data, quindi ho dovuto modificare:
# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
A
# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
Altri suggerimenti
Non è una risposta, ma trovo l'intera faccenda fopen/fread/fclose molto noiosa da esaminare quando guardo il codice.
Puoi sostituire:
$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);
Con:
$request = trim(file_get_contents('test.xml'));
Ma comunque - alla tua domanda;se queste sono le intestazioni inviate, non dovrebbe esserci un problema con il server remoto.Prova a modificare il contenuto del tuo file xml e a utilizzare var_dump() per controllare l'output esatto (inclusa la lunghezza della stringa, in modo da poter cercare le cose mancanti)
Spero possa aiutare
Ho fatto un wc -m test.xml
e sono tornato con 743 caratteri nel file XML e il file var_dump
SU $request
ritorna con 742 caratteri, quindi qualcosa viene eliminato trim()
(Presumo).
Ho fatto un:
print "=====" . $request . "=====";
e l'inizio e la fine dell'XML si scontrano con ===== senza spazi bianchi.