Получение содержимого из сообщения http с использованием php CURL - PullRequest
19 голосов
/ 14 марта 2012

Я пытаюсь отладить сообщение http, которое пытаюсь отправить из списка приложений.Мне удалось отправить правильный пост от php CURL, который напрямую взаимодействует с моим веб-сайтом drupal 7 и загружает изображение.

Для того, чтобы это работало в моем приложении на lisp, мне действительно нужно увидеть тело содержимого моего http-поста. Мне удалось увидеть заголовки, используя такой вызов:

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

и заголовки выглядят одинаково в моем приложении lisp, но я не смог изучить текст сообщения.Я искал в Интернете, и другие люди задавали этот вопрос, но никто не опубликовал ответ.

Тип содержимого моего http-поста:

application/x-www-form-urlencoded

Я также пробовал много инструментов отладки http-прокси, но они только когда-либо получали http GET, чтобы получить мою страницу php, но никогда не захватывали get.отправлено с сервера после выполнения кода php.

РЕДАКТИРОВАТЬ: я добавил фрагмент кода, показывающий, где я на самом деле загрузить файл изображения.

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

Ответы [ 6 ]

21 голосов
/ 14 марта 2012

CURLOPT_VERBOSE на самом деле должны показать детали.Если вы ищете содержание тела ответа, вы также можете использовать CURLOPT_RETURNTRANSFER, curl_exec(), чтобы затем вернуть тело ответа.

Если вам нужночтобы проверить тело запроса, CURLOPT_VERBOSE должен дать это вам, но я не совсем уверен.

В любом случае хороший сетевой анализатор должен предоставить вам все детали прозрачно.

Пример:

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

Вывод:

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">
...
9 голосов
/ 19 февраля 2016

Просто отправьте его на произвольный локальный порт и прослушайте его.

# terminal 1
nc -l localhost 12345

# terminal 2
php -e
<?php
$curl = curl_init('http://localhost:12345');
// etc
6 голосов
/ 12 ноября 2013

Вы были близки:

В руководстве по PHP указано, что вы должны вызывать константу CURLINFO_HEADER_OUT в curl_setopt и 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

Краткое описание

  • Установить curl_setopt
  • Установить curl_getinfo
  • Вызовить curl_getinfo после curl_exec
4 голосов
/ 14 марта 2012

Если вы говорите о просмотре ответа, если вы добавите curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );, то документ, возвращенный по запросу, должен быть возвращен с вашего звонка на curl_exec.

Если вы говорите опросматривая отправляемые вами постданные, вы все равно сможете их просмотреть, так как вы устанавливаете это в своем PHP.

РЕДАКТИРОВАТЬ: Отправка файла, а?Что такое содержание $file?Я предполагаю, вероятно, звонок на file_get_contents()?

Попробуйте что-то вроде этого:

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

Вы не можете просто отправить файл, вам все еще нужен массив постданных, который назначает ключ этому файлу (так что вы можете получить доступ к$_FILES['upload']).Кроме того, @ указывает cURL загрузить содержимое указанного файла и отправить его вместо строки.

2 голосов
/ 14 марта 2012

Я думаю, вам лучше делать это с прокси, чем в PHP. Я не думаю, что можно извлечь необработанные данные POST из библиотеки PHP CURL.

Прокси должен показать вам содержимое запроса и ответа

0 голосов
/ 12 января 2017

Чтобы получить заголовок, перед вызовом curl_exec необходимо установить флаг CURLINFO_HEADER_OUT . Затем используйте curl_getinfo с тем же флагом, чтобы получить заголовок после curl_exec.

Если вы хотите просмотреть данные записи, возьмите значение, которое вы установили в CURLOPT_POSTFIELDS

Например:

$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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...