Получение содержимого тела из 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 'java' 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";