Czy ktoś może mi pokazać, jak zrobić curl php z POST HTTP?
Chcę wysłać takie dane:
username=user1, password=passuser1, gender=1
Do www.domain.com
Oczekuję, że curl zwróci odpowiedź jak result=OK
. Czy są jakieś przykłady?
Czy ktoś może mi pokazać, jak zrobić curl php z POST HTTP?
Chcę wysłać takie dane:
username=user1, password=passuser1, gender=1
Do www.domain.com
Oczekuję, że curl zwróci odpowiedź jak result=OK
. Czy są jakieś przykłady?
Odpowiedzi:
<?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 { ... }
?>
CURLOPT_POSTFIELDS
jest tablica, Content-Type
nagłówek zostanie ustawiony na multipart/form-data
zamiast application/x-www-form-urlencoded
. php.net/manual/en/function.curl-setopt.php
true
zamiast 1
dla CURLOPT_POST
.
// 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);
<?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;
}
}
// 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()));
}
Uwaga dodatkowa: najlepiej byłoby stworzyć interfejs wywoływany AdapterInterface
na przykład getResponse()
metodą i pozwolić, aby klasa powyżej go zaimplementowała. Następnie zawsze możesz zamienić tę implementację na inny podobny adapter, bez żadnych skutków ubocznych dla twojej aplikacji.
Zwykle występuje problem z cURL w PHP w systemie operacyjnym Windows. Podczas próby połączenia się z punktem końcowym chronionym https, pojawi się komunikat o błędzie certificate verify failed
.
Większość ludzi robi tutaj, aby powiedzieć bibliotece cURL, aby po prostu zignorowała błędy certyfikatu i kontynuowała ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Dzięki temu Twój kod będzie działał, wprowadzasz ogromną lukę w zabezpieczeniach i umożliwiasz złośliwym użytkownikom przeprowadzanie różnych ataków na Twoją aplikację, takich jak atak Man In The Middle lub podobny .
Nigdy, nigdy tego nie rób. Zamiast tego wystarczy zmodyfikować php.ini
swój CA Certificate
plik i poinformować PHP, gdzie plik ma umożliwić poprawną weryfikację certyfikatów:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Najnowsze cacert.pem
można pobrać z Internetu lub wyodrębnić z ulubionej przeglądarki . Podczas zmiany php.ini
powiązanych ustawień pamiętaj o ponownym uruchomieniu serwera.
Umieść to w pliku o nazwie foobar.php:
<?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);
?>
Następnie uruchom go za pomocą polecenia php foobar.php
, zrzuca ten rodzaj danych wyjściowych do ekranu:
<!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>
Więc zrobiłeś POST PHP na www.google.com i wysłałeś mu trochę danych.
Gdyby serwer został zaprogramowany do odczytu zmiennych końcowych, mógłby na tej podstawie zdecydować się zrobić coś innego.
$postvars .= $key . $value;
powinien $postvars .= $key . $value ."&";
czy nie?
$fields
tablicę, a wyświetli ciąg zapytania.
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
http_build_query
:curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
Można to łatwo osiągnąć za pomocą:
<?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);
Curl Post + obsługa błędów + ustawianie nagłówków [dzięki @ 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',
]);
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;
}
curl_close
wewnątrz finally
bloku.
Jeśli formularz używa przekierowań, uwierzytelniania, plików cookie, SSL (https) lub czegokolwiek innego niż całkowicie otwarty skrypt oczekujący zmiennych POST, zaczniesz naprawdę zgrzytać zębami. Spójrz na Snoopy , który robi dokładnie to, co masz na myśli, jednocześnie eliminując konieczność ustawiania dużej części kosztów ogólnych.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Prostszą odpowiedzią JEŚLI przekazujesz informacje do swojej witryny, jest użycie zmiennej SESSION. Rozpocznij stronę php:
session_start();
Jeśli w którymś momencie są informacje, które chcesz wygenerować w PHP i przejść do następnej strony w sesji, zamiast używać zmiennej POST, przypisz ją do zmiennej SESSION. Przykład:
$_SESSION['message']='www.'.$_GET['school'].'.edu was not found. Please try again.'
Następnie na następnej stronie po prostu odwołujesz się do tej zmiennej SESSION. UWAGA: po użyciu upewnij się, że go zniszczyłeś, więc nie będzie się utrzymywał po użyciu:
if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
Oto kod przykładowy dla PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php
uwzględnienie w tych bibliotekach uprości rozwój
<?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, "");
...
?>
Jeśli spróbujesz zalogować się na stronie za pomocą plików cookie.
Ten kod:
if ($server_output == "OK") { ... } else { ... }
Może nie działać, jeśli spróbujesz się zalogować, ponieważ wiele witryn zwraca status 200, ale post nie powiódł się.
Łatwym sposobem sprawdzenia, czy logowanie się powiodło, jest sprawdzenie, czy ponownie ustawia pliki cookie. Jeśli na wyjściu ma ciąg Set-Cookies, oznacza to, że posty nie powiodły się i rozpoczyna nową sesję.
Również post może się powieść, ale zamiast tego można przekierować status 200.
Aby upewnić się, że post się powiódł, spróbuj:
Śledź lokalizację za postem, aby przejść do strony, na której post przekierowuje:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
A następnie sprawdź, czy w żądaniu istnieją nowe pliki cookie:
if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output))
{echo 'post successful'; }
else { echo 'not successful'; }
Przykłady przesyłania formularza i surowych danych:
$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);
http_build_query()
do obsługi parametrów; wystarczy przekazać tablicę, abyCURLOPT_POSTFIELDS
wystarczy.