it-swarm.com.de

PHP + curl, HTTP POST Beispielcode?

Kann mir jemand zeigen, wie man mit einem HTTP-POST ein PHP-Curl macht?

Ich möchte Daten wie diese senden:

username=user1, password=passuser1, gender=1

An www.domain.com

Ich erwarte, dass die Locke eine Antwort wie result=OK zurückgibt. Gibt es Beispiele?

435
mysqllearner
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>
742
miku

Verfahrens

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

Objektorientierter

<?php

// mutatis mutandis
namespace MyApp\Http;

class CurlPost
{
    private $url;
    private $options;

    /**
     * @param string $url     Request URL
     * @param array  $options cURL options
     */
    public function __construct($url, array $options = [])
    {
        $this->url = $url;
        $this->options = $options;
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function __invoke(array $post)
    {
        $ch = curl_init($this->url);

        foreach ($this->options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $response = curl_exec($ch);
        $error    = curl_error($ch);
        $errno    = curl_errno($ch);

        if (is_resource($ch)) {
            curl_close($ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $response;
    }
}

Verwendungszweck

// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');

try {
    // execute the request
    echo $curl([
        'username' => 'user1',
        'password' => 'passuser1',
        'gender'   => 1,
    ]);
} catch (\RuntimeException $ex) {
    // catch errors
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

Randnotiz hier: Es ist am besten, eine Art Schnittstelle mit dem Namen AdapterInterface zu erstellen, beispielsweise mit der Methode getResponse(), und diese von der obigen Klasse implementieren zu lassen. Dann können Sie diese Implementierung jederzeit mit einem anderen Adapter Ihrer Wahl austauschen, ohne dass dies Nebenwirkungen für Ihre Anwendung hat.

HTTPS verwenden/Datenverkehr verschlüsseln

Normalerweise liegt ein Problem mit cURL in PHP unter dem Windows-Betriebssystem vor. Beim Versuch, eine Verbindung zu einem https-geschützten Endpunkt herzustellen, wird die Fehlermeldung certificate verify failed angezeigt.

Was die meisten Leute hier tun, ist, der cURL-Bibliothek anzuweisen, einfach Zertifikatfehler zu ignorieren und fortzufahren (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). Damit Ihr Code funktioniert, führen Sie eine große Sicherheitslücke ein und ermöglichen böswilligen Benutzern, verschiedene Angriffe auf Ihre App auszuführen, z. B. Man In The Middle Angriff oder dergleichen.

Mach das niemals. Stattdessen müssen Sie nur Ihren php.ini ändern und PHP mitteilen, wo sich Ihre CA Certificate -Datei befindet, damit Zertifikate korrekt überprüft werden:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

Der neueste cacert.pem kann aus dem Internet heruntergeladen werden oder aus Ihrem bevorzugten Browser extrahiert . Denken Sie beim Ändern von php.ini-bezogenen Einstellungen daran, den Webserver neu zu starten.

225
emix

Ein Live-Beispiel für die Verwendung von php curl_exec zur Erstellung eines HTTP-Posts:

Fügen Sie dies in eine Datei mit dem Namen foobar.php ein:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

Führen Sie es dann mit dem Befehl php foobar.php aus, um diese Art von Ausgabe auf dem Bildschirm abzuspeichern:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

Sie haben also ein PHP POST an www.google.com gesendet und ihm einige Daten gesendet.

Wäre der Server so programmiert worden, dass er die Post-Variablen einliest, könnte er sich entscheiden, darauf basierend etwas anderes zu tun.

29
Eric Leschinski

Es ist leicht zu erreichen mit:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);
23
Vladimir Kovpak

Curl Post + Fehlerbehandlung + Header setzen [danke an @ mantas-d]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);
11
MSS
curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}
6
Mantas D

Wenn das Formular Weiterleitungen, Authentifizierung, Cookies, SSL (https) oder etwas anderes als ein vollständig offenes Skript verwendet, das POST Variablen erwartet, werden Sie sehr schnell anfangen, Ihre Zähne zusammenzubeißen. Schauen Sie sich Snoopy an, das genau das tut, was Sie sich vorgestellt haben, ohne viel Aufwand aufbringen zu müssen.

6
Anthony

Eine einfachere Antwort, wenn Sie Informationen an Ihre eigene Website übergeben, ist die Verwendung einer SESSION-Variablen. Php Seite beginnen mit:

session_start();

Wenn es irgendwann Informationen gibt, die Sie in PHP generieren und zur nächsten Seite der Sitzung weiterleiten möchten, weisen Sie sie einer SESSION-Variablen zu, anstatt eine POST -Variable zu verwenden. Beispiel:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found.  Please try again.'

Dann verweisen Sie auf der nächsten Seite einfach auf diese SESSION-Variable. HINWEIS: Stellen Sie nach der Verwendung sicher, dass Sie es zerstören, damit es nach der Verwendung nicht mehr besteht:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
3
user2532795

Hier sind ein paar Code für PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php

die Aufnahme in diese Bibliothek vereinfacht die Entwicklung

<?php
# Initialization
include("LIB_http.php");
include("LIB_parse.php");
$product_array=array();
$product_count=0;

# Download the target (store) web page
$target = "http://www.tellmewhenitchanges.com/buyair";
$web_page = http_get($target, "");
    ...
?>
3
AzizSM

Wenn Sie versuchen, sich vor Ort mit Cookies anzumelden.

Dieser Code:

if ($server_output == "OK") { ... } else { ... }

Funktioniert möglicherweise nicht, wenn Sie versuchen, sich anzumelden, da viele Websites den Status 200 zurückgeben, der Beitrag jedoch nicht erfolgreich ist.

Eine einfache Möglichkeit, um zu überprüfen, ob der Login-Beitrag erfolgreich ist, besteht darin, zu überprüfen, ob Cookies erneut gesetzt werden. Wenn in der Ausgabe die Zeichenfolge "Set-Cookies" enthalten ist, bedeutet dies, dass die Beiträge nicht erfolgreich sind und eine neue Sitzung gestartet wird.

Der Beitrag kann auch erfolgreich sein, aber der Status kann stattdessen 200 umleiten.

Um sicherzugehen, dass der Beitrag erfolgreich ist, versuchen Sie Folgendes:

Verfolgen Sie den Speicherort nach dem Beitrag, damit er zu der Seite weitergeleitet wird, auf die der Beitrag weitergeleitet wird:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Und dann prüfen Sie, ob in der Anfrage neue Cookies vorhanden sind:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }
2
Atanas Atanasov

Beispiele für das Senden von form und raw Daten:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify array of form fields
     */
    CURLOPT_POSTFIELDS => [
        'foo' => 'bar',
        'baz' => 'biz',
    ],
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);
0