Получение содержимого тела из http post с помощью php CURL

Я пытаюсь отлаживать сообщение 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-страницу, но никогда не захватывают получение, отправленное с сервера после выполнения PHP-кода.

EDIT: я добавил код snipet, в котором я фактически загружаю файл изображения.

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

Ответы

Ответ 1

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

Ответ 2

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

# terminal 1
nc -l localhost 12345

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

Ответ 3

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

В руководстве 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

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

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

EDIT: публикация файла, а? Каково содержание $file? Я предполагаю, вероятно, позвонить в file_get_contents()?

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

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

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

Ответ 5

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

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

Ответ 6

Чтобы получить заголовок, флаг CURLINFO_HEADER_OUT должен быть установлен до вызова curl_exec. Затем используйте 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";