web-dev-qa-db-fra.com

Obtenir le corps du contenu de http post en utilisant php CURL

J'essaie de déboguer un message http que j'essaie d'envoyer depuis l'application de liste. J'ai pu envoyer le message correct de php CURL qui correspond correctement à mon site web drupal 7 et télécharge une image. 

Pour que cela fonctionne dans mon application LISP, j'ai vraiment besoin de voir le contenu du contenu de mon article http. J'ai pu voir les en-têtes en utilisant un appel comme celui-ci:

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

et les en-têtes se ressemblent dans mon application LISP mais je n'ai pas pu examiner le corps du message. J'ai cherché en ligne et d'autres personnes ont posé cette question mais personne n'a répondu. 

Le type de contenu de mon article http est:

application/x-www-form-urlencoded

J'ai également essayé de nombreux outils de débogage de proxy http, mais ils n'ont jamais que http GET pour obtenir ma page php, mais ne capturent jamais l'envoi du serveur une fois le code php exécuté. 

EDIT: J'ai ajouté un fragment de code indiquant où je télécharge réellement le fichier image. 

// 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);
17
Mike2012

CURLOPT_VERBOSE devrait en fait afficher les détails. Si vous recherchez le contenu du corps de la réponse, vous pouvez également utiliser CURLOPT_RETURNTRANSFER , curl_exec() renverra ensuite le corps de la réponse.

Si vous devez inspecter le corps de la requête, CURLOPT_VERBOSE devrait vous le transmettre, mais je ne suis pas tout à fait sûr.

Dans tous les cas, un bon renifleur de réseau devrait vous donner tous les détails de manière transparente.

Exemple:

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

Sortie:

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">
...
20
hakre

Envoyez-le simplement à un port local aléatoire et écoutez-le.

# terminal 1
nc -l localhost 12345

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

Tu étais proche:

Le manuel PHP indique que vous devez appeler la constante CURLINFO_HEADER_OUT dans curl_setopt et 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

Synopsis

  • Définir curl_setopt 
  • Définir curl_getinfo 
  • Appelez curl_getinfo après curl_exec
6
mechimdi

Si vous envisagez d'afficher la réponse, si vous ajoutez curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );, le document renvoyé par la demande doit être renvoyé de votre appel à curl_exec.

Si vous parlez de visualiser les données postales que vous envoyez, eh bien, vous devriez pouvoir les voir de toute façon puisque vous les définissez dans votre PHP.

EDIT: Poster un fichier, hein? Quel est le contenu de $file? Je devine probablement un appel à file_get_contents()

Essayez quelque chose comme ça:

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

Vous ne pouvez pas simplement envoyer le fichier, vous avez toujours besoin d'un tableau de données qui attribue une clé à ce fichier (pour pouvoir y accéder dans PHP en tant que $_FILES['upload']). En outre, le @ indique à cURL de charger le contenu du fichier spécifié et de l’envoyer à la place de la chaîne.

4
Ryan P

Je pense que vous feriez mieux de le faire avec un proxy que dans PHP. Je ne pense pas qu'il soit possible d'extraire les données POST brutes de la bibliothèque PHP CURL.

Un proxy devrait vous montrer le contenu de la requête et de la réponse

2
James C