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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top