Kann mir jemand zeigen, wie man eine PHP-cURL mit einem HTTP-POST macht?
Ich möchte Daten wie folgt senden:
username=user1, password=passuser1, gender=1
Zu www.example.com
Ich erwarte, dass die cURL eine Antwort wie zurückgibt result=OK. Gibt es Beispiele?
miku
<?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 { ... }
?>
keine Notwendigkeit zu verwenden http_build_query() Parameter handhaben; Übergeben Sie einfach das Array an CURLOPT_POSTFIELDS reicht.
– Raubvogel
5. April 2016 um 3:13 Uhr
@Raptor, das ein Array direkt an CURLOPT_POSTFIELDS bereitstellt, macht tatsächlich eine etwas andere Art von POST. (Erwartet: 100-weiter)
– Oleg Popov
14. April 2016 um 4:49 Uhr
Auch wenn Wert von CURLOPT_POSTFIELDS ist ein Array, das Content-Type Header wird gesetzt multipart/form-data anstatt application/x-www-form-urlencoded. php.net/manual/en/function.curl-setopt.php
– Chloe
21. Juli 2016 um 2:34 Uhr
Die Verwendung von CURLOPT_RETURNTRANSFER bedeutet, dass curl_exec die Antwort als Zeichenfolge zurückgibt, anstatt sie auszugeben.
– bnp887
28. Dezember 2016 um 14:27 Uhr
Ich empfehle die Verwendung true anstatt 1 zum CURLOPT_POST.
– FluoreszierendGrün5
19. August 2017 um 8:53 Uhr
emixen
Verfahrenstechnisch
// 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);
Objektorientierte
<?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;
}
}
Nebenbemerkung hier: Es wäre am besten, eine Art Schnittstelle namens zu erstellen AdapterInterface zum Beispiel mit getResponse() -Methode und lassen Sie die obige Klasse sie implementieren. Dann können Sie diese Implementierung jederzeit durch einen anderen Adapter Ihrer Wahl ersetzen, ohne Nebenwirkungen für Ihre Anwendung.
Verwendung von HTTPS / Verschlüsselung des Datenverkehrs
Normalerweise gibt es ein Problem mit cURL in PHP unter dem Windows-Betriebssystem. Beim Versuch, eine Verbindung zu einem https-geschützten Endpunkt herzustellen, erhalten Sie eine Fehlermeldung, die Ihnen dies mitteilt certificate verify failed.
Die meisten Leute sagen hier der cURL-Bibliothek, dass sie Zertifikatsfehler einfach ignorieren und fortfahren soll (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). Da dies Ihren Code zum Laufen bringt, führen Sie eine riesige Sicherheitslücke ein und ermöglichen es böswilligen Benutzern, verschiedene Angriffe auf Ihre App durchzuführen, z Der Mann in der Mitte Angriff oder so.
Tu das niemals, niemals. Stattdessen müssen Sie einfach Ihre ändern php.ini und teilen Sie PHP mit, wo Ihre CA Certificate Datei ist es, Zertifikate korrekt überprüfen zu lassen:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Das Neueste cacert.pem kann aus dem Internet heruntergeladen werden bzw aus Ihrem bevorzugten Browser extrahiert. Beim Wechseln irgendwelche php.ini entsprechenden Einstellungen denken Sie daran, Ihren Webserver neu zu starten.
Dies sollte wirklich die akzeptierte Antwort sein, da es am besten wäre, die HTTP-Bibliothek die Codierung Ihrer Variablen handhaben zu lassen.
– Eric Seestrand
7. März 2016 um 14:57 Uhr
Dies ist nicht immer der Fall. Ich habe Webserver gesehen, die erwarten, dass POST-Variablen auf eine bestimmte Weise codiert werden, was dazu führt, dass sie andernfalls fehlschlagen. Es scheint mir, dass http_build_query() dafür tatsächlich zuverlässiger ist als cURL.
– César
14. März 2016 um 15:25 Uhr
Die HTTP-Spezifikation ist ziemlich einfach, wie die POST-Parameter aussehen sollten. Die Webserver-Software sollte sowieso Standards erfüllen.
– emix
15. März 2016 um 11:46 Uhr
Auf diese Weise zwingen Sie cURL dazu, einen etwas anderen POST-Typ zu verwenden. (Erwartet: 100-weiter). Überprüfen Sie diesen Artikel: support.urbanairship.com/entries/…
– Oleg Popov
14. April 2016 um 4:52 Uhr
Ausgehend von @ Césars Kommentar, dem PHP-Dokumentation weist ausdrücklich auf Folgendes hin: „Durch das Übergeben eines Arrays an CURLOPT_POSTFIELDS werden die Daten codiert als multipart/form-datawährend beim Übergeben einer URL-codierten Zeichenfolge die Daten als codiert werden application/x-www-form-urlencoded.”. Ich habe vor kurzem übermäßig viel Zeit damit verbracht, Fehler zu beheben, warum ein cURL-Aufruf auf einem Endpunkt eines Drittanbieters fehlschlägt, nur um schließlich festzustellen, dass sie keine Multipart/Form-Daten unterstützen.
– Jake Z
16. September 2016 um 19:31 Uhr
Erich Leschinski
Ein Live-Beispiel für die Verwendung von php curl_exec für einen HTTP-Post:
Fügen Sie dies in eine Datei namens foobar.php ein:
Führen Sie es dann mit dem Befehl aus php foobar.phpgibt es diese Art von Ausgabe auf dem Bildschirm aus:
<!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 einen 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 auf dieser Grundlage entscheiden, etwas anderes zu tun.
$postvars .= $key . $value; sollte $postvars .= $key . $value ."&"; oder nicht?
– Manwal
6. August 2014 um 7:41 Uhr
Wenn Sie sich diese Antwort noch einmal ansehen, können Sie auch Ihre benutzerdefinierte Implementierung des Query-String-Konverters durch ersetzen http_build_querygib ihm einfach die $fields array und es wird eine Abfragezeichenfolge ausgegeben.
– Benutzer2629998
17. November 2014 um 11:54 Uhr
Beachten Sie, dass Sie Ihre Daten verschlüsseln sollten, damit sie sicher übermittelt werden können.
– wtf8_decode
16. Januar 2015 um 17:45 Uhr
Oh nein, versuchen Sie nicht, die Postschnur selbst zu bauen! benutze das: curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
– Oriadam
29. September 2015 um 0:21 Uhr
-1, weil Sie Ihre Post-Variablen nicht maskieren. Das Beispiel des OP sendet vom Benutzer übermittelte Benutzernamen und Kennwörter zur Authentifizierung. Mit Ihrer Lösung kann sich ein Benutzer mit einem & in seinem Passwort niemals anmelden. oriadams Kommentar ist richtig, aber Sie können ihn weglassen http_build_query wie: curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Sie sollten curl_close innerhalb eines finally-Blocks verwenden.
– emix
25. Januar 2019 um 10:04 Uhr
1.Schritt für Schritt
Initialisieren Sie die cURL-Sitzung:
$url = "www.domain.com";
$ch = curl_init($url);
Wenn Ihre Anfrage Header wie Bearer-Token oder definierende JSON-Inhalte enthält, müssen Sie diese festlegen HTTPHEADER Optionen für cURL:
$token = "generated token code";
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json', // for define content type that is json
'bearer: '.$token, // send token in header request
'Content-length: 100' // content length for example 100 characters (can add by strlen($fields))
)
);
Wenn Sie den Header in den Ausgabesatz aufnehmen möchten CURLOPT_HEADER zu true:
curl_setopt($ch, CURLOPT_HEADER, false);
Satz RETURNTRANSFER Option zu true um die Übertragung als String zurückzugeben, anstatt sie direkt auszugeben:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
Zur Überprüfung kann das Vorhandensein eines Common Name im SSL-Peer-Zertifikat eingestellt werden 0(to not check the names), 1(not supported in cURL 7.28.1), 2(default value and for production mode):
Führen Sie cURL aus und geben Sie die Zeichenfolge zurück. Abhängig von Ihrer Ressource gibt dies eine Ausgabe wie zurück result=OK:
$result = curl_exec($ch);
cURL-Ressource schließen und Systemressourcen freigeben:
curl_close($ch);
2. Als Klasse verwenden
Das Ganze call_cURL Klasse erweiterbar:
class class_name_for_call_cURL {
protected function getUrl() {
return "www.domain.com";
}
public function call_cURL() {
$token = "generated token code";
$fields = array(
"username" => "user1",
"password" => "passuser1",
"gender" => 1
);
$url = $this->getUrl();
$output = $this->_execute($fields, $url, $token);
// if you want to get json data
// $output = json_decode($output);
if ($output == "OK") {
return true;
} else {
return false;
}
}
private function _execute($postData, $url, $token) {
// for sending data as json type
$fields = json_encode($postData);
$ch = curl_init($url);
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json', // if the content type is json
'bearer: '.$token // if you need token in header
)
);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
Verwendung der Klasse und Aufruf von cURL:
$class = new class_name_for_call_cURL();
var_dump($class->call_cURL()); // output is true/false
3.Eine Funktion
Eine Funktion für die Verwendung überall dort, wo sie benötigt wird:
function get_cURL() {
$url = "www.domain.com";
$token = "generated token code";
$postData = array(
"username" => "user1",
"password" => "passuser1",
"gender" => 1
);
// for sending data as json type
$fields = json_encode($postData);
$ch = curl_init($url);
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json', // if the content type is json
'bearer: '.$token // if you need token in header
)
);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
Diese Funktion ist nur nutzbar durch:
var_dump(get_cURL());
Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Sie sollten curl_close innerhalb eines finally-Blocks verwenden.
Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Du solltest curl_close in einem finally Block.
– emix
25. Januar 2019 um 10:03 Uhr
9929800cookie-checkPHP-, cURL- und HTTP-POST-Beispiel?yes