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?

Author: Vladimir Kovpak, 2010-01-26

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 { ... }
?>
 625
Author: miku,
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.

Nigdy, przenigdy tego nie rób. Zamiast tego wystarczy zmodyfikować 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.

 183
Author: emix,
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.

 25
Author: Eric Leschinski,
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);
 18
Author: Vladimir Kovpak,
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',
]);
 5
Author: MSS,
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.

 5
Author: Anthony,
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, "");
    ...
?>
 3
Author: Azi,
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']);}
 2
Author: user2532795,
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;
}
 2
Author: Mantas D,
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'; }
 1
Author: Atanas Atanasov,
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