Przekazywanie wartości $ _POST za pomocą cURL

95

Jak przekazujesz $_POSTwartości do strony za pomocą cURL?

Scott Gottreu
źródło

Odpowiedzi:

168

Powinno działać dobrze.

$data = array('name' => 'Ross', 'php_master' => true);

// You can POST a file by prefixing with an @ (for <input type="file"> fields)
$data['file'] = '@/home/user/world.jpg';

$handle = curl_init($url);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_exec($handle);
curl_close($handle)

Mamy tutaj dwie opcje, CURLOPT_POSTktóre włączają HTTP POST i CURLOPT_POSTFIELDSzawierają tablicę naszych danych postów do przesłania. Można to wykorzystać do przesłania danych do POST <form>s.


Należy zauważyć, że curl_setopt($handle, CURLOPT_POSTFIELDS, $data);dane $ są pobierane w dwóch formatach i że to określa sposób kodowania danych pocztowych.

  1. $datajako array(): Dane zostaną wysłane jako, multipart/form-dataktóre nie zawsze są akceptowane przez serwer.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
    
  2. $datajako ciąg zakodowany jako adres URL: dane zostaną wysłane jako application/x-www-form-urlencoded, co jest domyślnym kodowaniem dla przesłanych danych formularza html.

    $data = array('name' => 'Ross', 'php_master' => true);
    curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));
    

Mam nadzieję, że pomoże to innym zaoszczędzić czas.

Widzieć:

Ross
źródło
Twoja notatka pozwoliła mi zaoszczędzić przynajmniej godzinę na debugowaniu. Dzięki.
Vivek Kumar
30

Ross ma dobry pomysł na przesłanie zwykłego formatu parametru / wartości do adresu URL.

Niedawno natknąłem się na sytuację, w której musiałem opublikować plik XML jako tekst / xml typu Content-Type bez żadnych par parametrów, więc oto jak to zrobić:

$xml = '<?xml version="1.0"?><stuff><child>foo</child><child>bar</child></stuff>';
$httpRequest = curl_init();

curl_setopt($httpRequest, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($httpRequest, CURLOPT_HTTPHEADER, array("Content-Type:  text/xml"));
curl_setopt($httpRequest, CURLOPT_POST, 1);
curl_setopt($httpRequest, CURLOPT_HEADER, 1);

curl_setopt($httpRequest, CURLOPT_URL, $url);
curl_setopt($httpRequest, CURLOPT_POSTFIELDS, $xml);

$returnHeader = curl_exec($httpRequest);
curl_close($httpRequest);

W moim przypadku musiałem przeanalizować niektóre wartości z nagłówka odpowiedzi HTTP, więc niekoniecznie musisz ustawić CURLOPT_RETURNTRANSFERlub CURLOPT_HEADER.

Mark Biek
źródło
1
Nie o to pyta plakat, ale tak się składa, że ​​jest to dokładnie to, czego szukałem, dzięki!
davr
Cieszę się, że ktoś inny uznał to za pomocne.
Mark Biek
1
twoja "curl_setopt ($ httpRequest, CURLOPT_HTTPHEADER, tablica (" Content-Type: text / xml "));" rozwiązałem coś, co zajęło mi już kilka godzin! wielkie dzięki :)
Alexei Tenitski
Cześć Mark, jeśli masz czas, czy możesz mi pomóc? .. Proszę. kliknij tutaj
jayAnn
Spędziliśmy nasze, próbując dowiedzieć się, dlaczego moje dane xml nie zostały zaakceptowane, gdy zostały wysłane jako zakodowane w formacie urlencoded. Zapisał mnie typ zawartości i brak kodu urlencode. Dzięki.
Samuel
3
$query_string = "";

if ($_POST) {
    $kv = array();
    foreach ($_POST as $key => $value) {
        $kv[] = stripslashes($key) . "=" . stripslashes($value);
    }
    $query_string = join("&", $kv);
}

if (!function_exists('curl_init')){
    die('Sorry cURL is not installed!');
}

$url = 'https://www.abcd.com/servlet/';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($kv));
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);

curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$result = curl_exec($ch);

curl_close($ch);
Sapnandu
źródło
3

Kolejny prosty przykład użycia cURL w PHP:

<?php
    $ch = curl_init();                    // Initiate cURL
    $url = "http://www.somesite.com/curl_example.php"; // Where you want to post data
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, true);  // Tell cURL you want to post something
    curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to post
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Return the output in string format
    $output = curl_exec ($ch); // Execute

    curl_close ($ch); // Close cURL handle

    var_dump($output); // Show output
?>

Przykład znaleziony tutaj: http://devzone.co.in/post-data-using-curl-in-php-a-simple-example/

Zamiast używać curl_setopt, możesz użyćcurl_setopt_array .

http://php.net/manual/en/function.curl-setopt-array.php

juliański
źródło
Dziękuję Ci!! - Twój kod curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=value1&var2=value2&var_n=value_n"); // Define what you want to postdostarczył mi tego, czego szukałem :)
asugrue15
2

Sprawdź tę stronę, na której znajduje się przykład, jak to zrobić.

Andy Griffin
źródło
2
Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
Nanne,
1
$url='Your url'; // Specify your url
$data= array('parameterkey1'=>value,'parameterkey2'=>value); // Add parameters in key value
$ch = curl_init(); // Initialize cURL
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
Aniket B
źródło
1
Czy mógłbyś rozwinąć tę odpowiedź? Kilka linijek kodu nie daje odpowiedzi.
Rich Benner
1) Określ swój adres URL 2) Utwórz tablicę parametrów 3) Zainicjuj curl 4) Ustaw Wymagane opcje curl 5) Wykonaj Curl 6) Zamknij Curl
Aniket B
0
<?php
    function executeCurl($arrOptions) {

        $mixCH = curl_init();

        foreach ($arrOptions as $strCurlOpt => $mixCurlOptValue) {
            curl_setopt($mixCH, $strCurlOpt, $mixCurlOptValue);
        }

        $mixResponse = curl_exec($mixCH);
        curl_close($mixCH);
        return $mixResponse;
    }

    // If any HTTP authentication is needed.
    $username = 'http-auth-username';
    $password = 'http-auth-password';

    $requestType = 'POST'; // This can be PUT or POST

    // This is a sample array. You can use $arrPostData = $_POST
    $arrPostData = array(
        'key1'  => 'value-1-for-k1y-1',
        'key2'  => 'value-2-for-key-2',
        'key3'  => array(
                'key31'   => 'value-for-key-3-1',
                'key32'   => array(
                    'key321' => 'value-for-key321'
                )
        ),
        'key4'  => array(
            'key'   => 'value'
        )
    );

    // You can set your post data
    $postData = http_build_query($arrPostData); // Raw PHP array

    $postData = json_encode($arrPostData); // Only USE this when request JSON data.

    $mixResponse = executeCurl(array(
        CURLOPT_URL => 'http://whatever-your-request-url.com/xyz/yii',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPGET => true,
        CURLOPT_VERBOSE => true,
        CURLOPT_AUTOREFERER => true,
        CURLOPT_CUSTOMREQUEST => $requestType,
        CURLOPT_POSTFIELDS  => $postData,
        CURLOPT_HTTPHEADER  => array(
            "X-HTTP-Method-Override: " . $requestType,
            'Content-Type: application/json', // Only USE this when requesting JSON data
        ),

        // If HTTP authentication is required, use the below lines.
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD  => $username. ':' . $password
    ));

    // $mixResponse contains your server response.
Mohammad Faisal Islam
źródło