wake-up-neo.net

Holen Sie sich den Inhalt des Hauptteils von http post mit PHP CURL

Ich versuche, einen http-Beitrag zu debuggen, den ich versuche, von der Listenanwendung zu senden. Ich konnte den richtigen Beitrag von PHP-CURL senden, der korrekt mit meiner Drupal 7-Website verbunden ist und ein Bild hochlädt. 

Damit dies in meiner LISP-Anwendung funktioniert, muss ich wirklich den Inhalt meines http-Posts sehen. Ich konnte die Header mit einem Aufruf wie folgt anzeigen:

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

die Kopfzeilen sehen in meiner LISP-Anwendung genauso aus, aber ich konnte den Hauptteil des Beitrags nicht untersuchen. Ich habe online gesucht und andere Leute haben diese Frage gestellt, aber niemand hat eine Antwort gepostet. 

Der Inhaltstyp meines http-Beitrags lautet:

application/x-www-form-urlencoded

Ich habe auch viele http-Proxy-Debugging-Tools ausprobiert, aber sie erhalten immer nur den http-Befehl, um meine PHP-Seite abzurufen, erfassen aber niemals den get-Server, wenn der PHP-Code ausgeführt wird. 

BEARBEITEN: Ich habe ein Code-Snipet hinzugefügt, aus dem hervorgeht, wo ich die Bilddatei tatsächlich hochlade. 

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

CURLOPT_VERBOSE sollte tatsächlich die Details anzeigen. Wenn Sie nach dem Inhalt des Antworttextes suchen, können Sie auch den Befehl CURLOPT_RETURNTRANSFER verwenden. curl_exec() / gibt dann den Antworttext zurück.

Wenn Sie den Anfragetext überprüfen müssen, sollte CURLOPT_VERBOSE Ihnen das geben, aber ich bin nicht ganz sicher.

In jedem Fall sollte ein guter Netzwerk-Sniffer Ihnen alle Details transparent geben.

Beispiel:

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

Ausgabe:

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

Schicken Sie es einfach an einen beliebigen lokalen Port und hören Sie ihm zu.

# terminal 1
nc -l localhost 12345

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

Du warst nah:

Das PHP manual gibt an, dass Sie die Konstante CURLINFO_HEADER_OUT sowohl in curl_setopt als auch in curl_getinfo aufrufen müssen.

$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

Synopsis

  • Curl_setopt setzen 
  • Legen Sie curl_getinfo fest 
  • Rufen Sie curl_getinfo nach curl_exec auf
6
mechimdi

Wenn Sie über die Anzeige der Antwort sprechen und curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); hinzufügen, sollte das von der Anforderung zurückgegebene Dokument von Ihrem Aufruf an curl_exec zurückgegeben werden.

Wenn Sie über das Anzeigen der Postdaten sprechen, die Sie senden, sollten Sie dies trotzdem tun können, da Sie dies in Ihrem PHP festlegen.

BEARBEITEN: Eine Datei posten, oder? Was ist der Inhalt von $file? Ich vermute, wahrscheinlich ein Anruf an file_get_contents()

Versuchen Sie etwas so:

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

Sie können die Datei nicht einfach nur senden, Sie benötigen dennoch ein Postdata-Array, das dieser Datei einen Schlüssel zuweist (damit Sie in PHP als $_FILES['upload'] zugreifen können). Außerdem gibt der @ cURL an, den Inhalt der angegebenen Datei zu laden und diesen anstelle der Zeichenfolge zu senden.

4
Ryan P

Ich denke, es ist besser mit einem Proxy als mit PHP. Ich denke nicht, dass es möglich ist, die Rohdaten POST aus der PHP CURL-Bibliothek zu ziehen.

Ein Proxy sollte Ihnen den Inhalt der Anfrage und der Antwort anzeigen

2
James C