PHP + curl, HTTP POST przykładowy kod?
Czy ktoś może mi pokazać jak zrobić PHP curl z postem HTTP?
Chcę wysłać dane w ten sposób:
username=user1, password=passuser1, gender=1
Do www.domain.com
Oczekuję, że curl zwróci odpowiedź podobną do result=OK
. Czy są jakieś przykłady?
10 answers
<?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 { ... }
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 07:50:19
// 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);
Zorientowane obiektowo
<?php
namespace MyApp\Http;
class Curl
{
/** @var resource cURL handle */
private $ch;
/** @var mixed The response */
private $response = false;
/**
* @param string $url
* @param array $options
*/
public function __construct($url, array $options = array())
{
$this->ch = curl_init($url);
foreach ($options as $key => $val) {
curl_setopt($this->ch, $key, $val);
}
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
}
/**
* Get the response
* @return string
* @throws \RuntimeException On cURL error
*/
public function getResponse()
{
if ($this->response) {
return $this->response;
}
$response = curl_exec($this->ch);
$error = curl_error($this->ch);
$errno = curl_errno($this->ch);
if (is_resource($this->ch)) {
curl_close($this->ch);
}
if (0 !== $errno) {
throw new \RuntimeException($error, $errno);
}
return $this->response = $response;
}
/**
* Let echo out the response
* @return string
*/
public function __toString()
{
return $this->getResponse();
}
}
// usage
$curl = new \MyApp\Http\Curl('http://www.example.com', array(
CURLOPT_POSTFIELDS => array('username' => 'user1')
));
try {
echo $curl;
} catch (\RuntimeException $ex) {
die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}
Uwaga na marginesie: najlepiej byłoby stworzyć jakiś interfejs o nazwie AdapterInterface
na przykład za pomocą metody getResponse()
i pozwolić klasie zaimplementować go. Wtedy zawsze możesz zamienić tę implementację z innym adapterem, bez żadnych skutków ubocznych dla Twojej aplikacji.
Używanie HTTPS / szyfrowanie ruchu
Zazwyczaj występuje problem z cURL w PHP pod systemem operacyjnym Windows. Podczas próby aby połączyć się z chronionym punktem końcowym https, pojawi się błąd informujący o tym certificate verify failed
.
Większość ludzi mówi bibliotece cURL, aby po prostu ignorowała błędy certyfikatu i kontynuowała (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). Ponieważ to sprawi, że Twój kod będzie działał, wprowadzasz ogromną dziurę w zabezpieczeniach i umożliwiasz złośliwym użytkownikom wykonywanie różnych ataków na Twoją aplikację, takich jak atak Man in the Middle czy takie.
php.ini
i powiedzieć PHP, gdzie Twój plik CA Certificate
ma pozwolić na poprawną weryfikację certyfikatów:
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
Najnowszy cacert.pem
można pobrać z Internetu lub wyodrębnić z ulubionej przeglądarki. Zmieniając dowolne ustawienia związane z php.ini
pamiętaj o ponownym uruchomieniu serwera www.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 07:52:41
Przykład użycia PHP curl_exec do wykonania postu HTTP:
Włóż to do 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
, zrzuci ten rodzaj wyjścia na ekran:
<!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 do www.google.com i wysłałem mu dane.
Gdyby serwer został zaprogramowany do odczytu zmiennych post, mógłby zdecydować się na coś innego w oparciu o to.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-21 12:48:17
Można do niego łatwo dotrzeć 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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 05:45:33
Curl Post + Obsługa błędów + Ustaw nagłówki [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',
]);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 14:54:38
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 zgrzytać zębami naprawdę szybko. Spójrz na Snoopy , który robi dokładnie to, co masz na myśli, eliminując potrzebę skonfigurowania dużej ilości kosztów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 15:37:40
Oto jakiś kod do PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php
Dołączenie do tych bibliotek ułatwi 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, "");
...
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 08:41:58
Prostszą odpowiedzią, jeśli przekazujesz informacje do własnej strony internetowej, jest użycie zmiennej sesji. Rozpocznij stronę php od:
session_start();
Jeśli w pewnym momencie pojawi się informacja, którą chcesz wygenerować w PHP i przekazać do następnej strony w sesji, zamiast używać zmiennej POST, przypisz ją do zmiennej sesji. 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 sesji. Uwaga: po użyciu upewnij się, że go zniszczysz, aby nie utrzymywał się po nim użyte:
if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 17:52:41
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);
if (curl_error($ch)) {
throw new \Exception(curl_error($ch));
}
curl_close($ch);
return $response;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 06:43:57
Jeśli próbujesz zalogować się na stronie za pomocą Plików cookie.
Ten kod:
if ($server_output == "OK") { ... } else { ... }
Może nie działać, jeśli próbujesz się zalogować, ponieważ wiele stron zwraca status 200, ale post nie powiódł się.
Łatwym sposobem sprawdzenia, czy wpis logowania się powiódł, jest sprawdzenie, czy ponownie ustawia pliki cookie. Jeśli na wyjściu ma ustawiony ciąg ciasteczek, oznacza to, że posty nie powiodły się i rozpoczyna nową sesję.
Również post może się udać, ale status może być przekierowany 200.
Aby mieć pewność, że post się powiedzie spróbuj tego:
Śledź lokalizację po poście, więc przejdzie do strony, na której post przekierowuje do:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
I następnie sprawdź, czy nowe pliki cookie istnieją w żądaniu:
if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output))
{echo 'post successful'; }
else { echo 'not successful'; }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 10:02:31