2010-12-07 7 views
2

J'essaie de télécharger une image sur un site via leur API en essayant d'imiter un formulaire Web et en affichant les données en utilisant cURL. Je cherche à vérifier ce que cURL envoie réellement au site de destination, pour m'assurer que j'ai bien construit la requête. Je vois que vous pouvez utiliser CURLOPT_VERBOSE pour voir ce qu'il est d'envoyer dans l'en-tête de demande, mais je cherche à voir les données affichées, aprèsDemande HTTP complète de cURL en PHP

Content-Type: multipart/form-data; boundary=----------------------------91f22eea64e8 

Les données que je suis l'affichage est en poste $ et la demande est

 $ch = curl_init(); 
     $opts = array(
      CURLOPT_POST => 1, 
      CURLOPT_CONNECTTIMEOUT => 10, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_TIMEOUT => 60, 
      CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible;)', 
      CURLOPT_POSTFIELDS => $post, 
      CURLOPT_URL => 'https://example.com/api', 
      CURLOPT_HTTPHEADER => array('Expect:'), 
      CURLOPT_VERBOSE => 1 
     ); 
     curl_setopt_array($ch, $opts); 
     $response = curl_exec($ch); 

Merci

+0

Pouvez-vous juste renifler le trafic en utilisant tcpflow? (sudo tcpflow -c -i eth0 hôte foobar.com). Remplacer eth0 par en0 sur un Mac; en1 pour le wifi, etc. –

+0

Merci pour cela Paul. J'ai essayé de faire quelque chose de similaire avec dumcap et de sauvegarder les données dans un fichier, mais c'était illisible, je pense que c'était en binaire. J'ai essayé votre suggestion avec tcpflow et j'ai obtenu un résultat similaire malheureusement. – eclipse31

Répondre

3

J'ai traité ce problème dans le passé en envoyant les données cURL moi-même d'abord, pour vous assurer que je vous envoie les bonnes choses. Le fichier sur mon propre serveur web que je voudrais envoyer (probablement le même serveur web d'où je viens) n'a besoin que de cela dans un fichier .php: <?php echo file_get_contents('php://input'); ?> alors définissez l'URL de ce fichier pour votre CURLOPT_URL dans votre php actuel script, puis envoyez-le avec echo $response; dans votre code d'appel curl pour voir ce qui a été envoyé. Voir également: http://www.codediesel.com/php/reading-raw-post-data-in-php/ et http://php.net/manual/en/wrappers.php.php pour des détails supplémentaires/exemples. Oh, bien qu'en relisant votre question je vois que vous envoyez une image, donc vous devez envoyer des données multipart/form et cela ne fonctionne pas avec le flux php://input, vous devez utiliser php://stdin pour cela , selon les documents PHP liés ci-dessus. Je m'attends à ce que cela fonctionne de la même manière.

+0

Merci pour ce Chris. J'avais de grands espoirs pour votre solution, car c'est une bonne idée, mais malheureusement je n'ai pas réussi à la faire fonctionner. Même en faisant un simple post et en faisant écho à file_get_contents ('php: // input'), il n'y avait pas de données. Le mieux que je pouvais faire était de faire écho à print_r ($ _ POST, 1). J'ai même essayé de placer always_populate_raw_post_data dans mon php.ini (sans oublier de redémarrer Apache) et de faire un print_r ($ HTTP_RAW_POST_DATA, 1) mais pas de joie non plus. – eclipse31

+0

Je l'ai testé moi-même maintenant, et bien qu'il fonctionne correctement avec php: // entrée lors de la soumission de données x-www-form-urlencoded via post, avec multipart/form-data, rien ne sort par php: // input ou php: // stdin. Oui, je voudrais savoir quoi faire à ce sujet, sauf que je doute que vous vouliez vraiment voir les données encodées en base64 pour votre fichier image, donc je recommande toujours ma solution originale et je soumets tous les champs sauf les fichiers téléchargés, et avec curl, cela devrait automatiquement omettre multipart/form-data afin que vous puissiez voir tout le reste correctement soumis. – Chris

+0

Oh, mes excuses, vous devez transformer $ post en une chaîne, la forme de tableau associatif est toujours envoyée en multipart/form-data avec cURL en PHP (http://www.php.net/manual/fr/function). curl-setopt.php @ CURLOPT_POSTFIELDS), utilisez donc ceci: 'CURLOPT_POSTFIELDS => http_build_query ($ post)' et cela enverra les données, moins les données base64'd des fichiers binaires (images) que vous transférez. – Chris