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

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

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

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

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

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

Если вы говорите о просмотре ответа, добавьте 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 загрузить содержимое указанного файла и отправить его вместо строки.

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

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

Чтобы получить заголовок, флаг 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";