2012-03-14 33 views
15

Estoy tratando de depurar una publicación http de la que estoy intentando enviar desde la aplicación de la lista. Pude enviar la publicación correcta de php CURL, que se conecta de forma correcta con mi sitio web de drupal 7 y carga una imagen.Obteniendo el cuerpo de contenido de http post usando php CURL

Con el fin de conseguir que esto funcione en mi solicitud Lisp que realmente necesita ver el cuerpo del contenido de mis post http he podido ver las cabeceras mediante una llamada de la siguiente manera:

curl_setopt($curl, CURLOPT_STDERR, $fp); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 

y la los encabezados tienen el mismo aspecto en mi aplicación de lisp, pero no he podido examinar el cuerpo de la publicación. He buscado en línea y otras personas han hecho esta pregunta, pero nadie publicó una respuesta.

El tipo de contenido de mis post http es:

application/x-www-form-urlencoded 

También he probado muchos proxy HTTP herramientas debuging pero solamente siempre el HTTP GET para obtener mi página php pero nunca capturar el enviadas desde el servidor una vez el código php se ejecuta.

EDITAR: He agregado un snipet de código que muestra dónde realmente cargo el archivo de imagen.

// file 
$file = array(
    'filesize' => filesize($filename), 
    'filename' => basename($filename), 
    'file' => base64_encode(file_get_contents($filename)), 
    'uid' => $logged_user->user->uid, 
); 

$file = http_build_query($file); 

// REST Server URL for file upload 
$request_url = $services_url . '/file'; 

// cURL 
$curl = curl_init($request_url); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); 
curl_setopt($curl, CURLOPT_STDERR, $fp); 
curl_setopt($curl, CURLOPT_VERBOSE, 1); 
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST 
curl_setopt($curl, CURLOPT_POSTFIELDS, $file); // Set POST data 
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header 
curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); // use the previously saved session 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); 
curl_setopt_array($curl, array(CURLINFO_HEADER_OUT => true)); 
$response = curl_exec($curl); 
+0

No creo que pueda encontrar una respuesta a esto? – user1854496

+0

'curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);' – Bobot

Respuesta

18

CURLOPT_VERBOSE debería mostrar los detalles. Si está buscando el contenido del cuerpo de la respuesta, también puede usar CURLOPT_RETURNTRANSFER, curl_exec() y luego devolverá el cuerpo de la respuesta.

Si necesita inspeccionar el cuerpo de la solicitud, CURLOPT_VERBOSE debería dárselo, pero no estoy del todo seguro.

En cualquier caso, un good network sniffer debe darle todos los detalles de forma transparente.

Ejemplo:

$curlOptions = array(
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_FOLLOWLOCATION => TRUE, 
    CURLOPT_VERBOSE => TRUE, 
    CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'), 
    CURLOPT_FILETIME => TRUE, 
); 

$url = "http://stackoverflow.com/questions/tagged/java"; 
$handle = curl_init($url); 
curl_setopt_array($handle, $curlOptions); 
$content = curl_exec($handle); 
echo "Verbose information:\n", !rewind($verbose), stream_get_contents($verbose), "\n"; 
curl_close($handle); 
echo $content; 

Salida:

Verbose information: 
* About to connect() to stackoverflow.com port 80 (#0) 
* Trying 64.34.119.12... 
* connected 
* Connected to stackoverflow.com (64.34.119.12) port 80 (#0) 
> GET /questions/tagged/java HTTP/1.1 
Host: stackoverflow.com 
Accept: */* 

< HTTP/1.1 200 OK 
< Cache-Control: private 
< Content-Type: text/html; charset=utf-8 
< Date: Wed, 14 Mar 2012 19:27:53 GMT 
< Content-Length: 59110 
< 
* Connection #0 to host stackoverflow.com left intact 

<!DOCTYPE html> 
<html> 



<head> 



    <title>Newest &#39;java&#39; Questions - Stack Overflow</title> 
    <link rel="shortcut icon" href="http://cdn.sstatic.net/stackoverflow/img/favicon.ico"> 
    <link rel="apple-touch-icon" href="http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png"> 
    <link rel="search" type="application/opensearchdescription+xml" title="Stack Overflow" href="/opensearch.xml"> 
... 
+0

CURLOPT_VERBOSE solo parece mostrarme el encabezado. ¿Hay algún otro indicador que necesite establecer? – Mike2012

+0

Wireshark solo parece mostrarme los GET que se envían para cargar la página my php pero no el mensaje POST enviado desde el código PHP. – Mike2012

+0

@ Mike2012: Sí, CURLOPT_VERBOSE no devuelve el cuerpo de la respuesta. He agregado un ejemplo que muestra cómo recuperar el cuerpo de la respuesta, que es 'CURLOPT_RETURNTRANSFER'. Si eso no es lo que necesita, por favor especifique lo que necesita. Y wireshark te muestra * todo * que va por el cable. – hakre

2

Creo que es mejor hacer esto con un proxy que en el PHP. No creo que sea posible extraer los datos de POST sin procesar de la biblioteca PHP CURL.

Un proxy que debe mostrar los contenidos de petición y respuesta

+0

Gracias por su respuesta James. He intentado bastantes proxies pero solo parecen captar el GET para cargar mi página php, nunca el POST del código php que se está ejecutando. – Mike2012

4

Si estamos hablando sobre la visualización de la respuesta, si se agrega curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);, a continuación, el documento devuelto por la solicitud debe ser devuelto a su llamada a curl_exec.

Si está hablando de ver los datos de publicación que está enviando, bueno, debería poder verlo de todos modos, ya que lo está configurando en su PHP.

EDITAR: Publicando un archivo, ¿eh? ¿Cuál es el contenido de $file? Supongo que probablemente llame al file_get_contents()?

intentar algo como esto:

$postdata = array('upload' => '@/path/to/upload/file.ext'); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); 

No se puede enviar el archivo, usted todavía necesita una matriz postdata que asigna una clave para ese archivo (para que pueda acceder en PHP como $_FILES['upload']).Además, el @ le dice a cURL que cargue el contenido del archivo especificado y lo envíe en lugar de la cadena.

+0

Hola, Ryan, gracias por tu respuesta. Estoy intentando ver los datos posteriores, pero no los estoy configurando directamente. Estoy intentando subir un archivo con esta publicación y lo configuré con una llamada como esta: curl_setopt ($ curl, CURLOPT_POSTFIELDS, $ file); ¿De alguna manera todavía puedo imprimir esto? – Mike2012

+0

@ Mike2012 Bien, he actualizado mi respuesta. Avíseme si mis suposiciones son incorrectas y publique el código si es necesario. –

+0

gracias de nuevo. Estoy cargando un archivo de imagen y he actualizado mi ejemplo para incluir un fragmento de código que muestra cómo lo estoy haciendo. En su ejemplo, parece que la carga de la etiqueta está asociada con el archivo y luego se utiliza como acceso a $ _FILES, pero en mi caso no lo configuré del todo. ¿Podría hacer algo similar con mi código? Además, en mi ejemplo, ¿estos datos de archivos serían el contenido completo de los postdatos o habría algún tipo de encabezado que especifique el nombre del archivo y demás? – Mike2012

6

estaban cerca:

El PHP manual instruye que se debe llamar al CURLINFO_HEADER_OUT constante en tanto curl_setopt y curl_getinfo.

$ch = curl_init($url); 
... other curl options ... 
curl_setopt($ch,CURLINFO_HEADER_OUT,true); 

curl_exec(ch); 
//Call curl_getinfo(*args) after curl_exec(*args) otherwise the output will be NULL. 
$header_info = curl_getinfo($ch,CURLINFO_HEADER_OUT); //Where $header_info contains the HTTP Request information 

Sinopsis

  • Conjunto curl_setopt
  • Conjunto curl_getinfo
  • llamada curl_getinfo después curl_exec
+3

Eso solo parece mostrar los encabezados, la pregunta es sobre el cuerpo de la solicitud – ChristoKiwi

8

simplemente lo envían a un puerto local aleatorio y escuchar en él.

# terminal 1 
nc -l localhost 12345 

# terminal 2 
php -e 
<?php 
$curl = curl_init('http://localhost:12345'); 
// etc 
+0

que tuve que hacer 'nc -l localhost -p 12345' – par

0

Para obtener el encabezado del CURLINFO_HEADER_OUT bandera necesita ser puesto delante de curl_exec se llama. Luego use curl_getinfo con la misma bandera para obtener el encabezado después de curl_exec.

Si desea ver los datos de envío, toma el valor se establece en CURLOPT_POSTFIELDS

Por ejemplo:

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "http://example.com/webservice"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload)); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 

curl_exec($ch); 

$header = curl_getinfo($ch, CURLINFO_HEADER_OUT); 

curl_close($ch); 

echo "Request-Header:\r\n" . $header . "\r\n"; 
echo "Request-Body(URL Encoded):\r\n" . http_build_query($payload) . "\r\n"; 
echo "Request-Body(Json Encoded):\r\n" . json_encode($payload) . "\r\n"; 
Cuestiones relacionadas