Pregunta

Yo estoy intentando POST en contra de un proveedor de servidor usando PHP 5.2 con cURL.Estoy leyendo en un documento XML para publicar en contra de su servidor y, a continuación, leer en una respuesta:

$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);

Ese código, en una de por sí, funciona bien, pero el otro servidor devuelve una respuesta desde el analizador XML que indica:

El contenido no permitido en prolog

Yo esperaba que de error y esto normalmente es causado por un espacio en blanco antes de que el XML, pero estaba seguro de que el archivo XML en sí no tiene espacios en blanco y el trim() debería aclarar eso de todos modos.Hice un TCPDump en la conexión mientras corrí el código y esto es lo que se envía:

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--

Antes y después de la [SNIP] de la línea no es visible en los espacios en blanco cuando puedo volver a jugar a la sesión en Etéreo.Esto es lo que está causando el problema y, si es así, ¿cómo puedo quitar, o estoy mirando demasiado lejos y esto puede ser un problema con el servidor que voy a postear en contra?

¿Fue útil?

Solución 2

Resulta que es un problema de codificación.La aplicación aparentemente necesidades de los XML en www-form-urlencoded en lugar de la forma-datos, por lo que tuve que cambiar:

# 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));

Otros consejos

No una respuesta, pero me parece que todo el fopen/fread/fclose cosa muy aburrido para leer cuando se mira en el código.

Puede reemplazar:

$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'));

Pero de todos modos a su pregunta;si esos son los encabezados que están siendo enviados, entonces no debería ser un problema con el servidor remoto.Pruebe a cambiar el contenido de su archivo xml y el uso de la función var_dump() para comprobar el resultado exacto (incluyendo la longitud de la cuerda, de modo que usted puede buscar que faltan cosas)

Espero que ayude

Hice un wc -m test.xml y volvió con 743 caracteres en el archivo XML y el var_dump en $request vuelve con 742 caracteres para que algo se está poniendo despojado con trim() (Asumo).

Yo hice:

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

y el inicio y el final de la XML colillas de arriba a la derecha contra el ===== con ningún espacio en blanco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top