簡體   English   中英

CURL永久設置CURLOPT_POST

[英]CURL set CURLOPT_POST perminetelly

當我用curl進行多個請求時,我得到一個非常奇怪的行為。 這是我的功能:

function http_request($curl, $url, $post = null)
{
    echo (isset($post) ? 'POST ' . $url : 'GET ' . $url) . PHP_EOL;

    try
    {
        $cookie_path = tempnam(null, 'b');

        curl_setopt_array($curl, array
        (
            CURLOPT_COOKIEFILE          => $cookie_path,
            CURLOPT_COOKIEJAR           => $cookie_path,
            CURLOPT_RETURNTRANSFER      => true,
            CURLOPT_FOLLOWLOCATION      => true,
            CURLOPT_POST                => count($post),
            CURLOPT_POSTFIELDS          => $post,
            CURLOPT_HEADER              => true,
            CURLOPT_AUTOREFERER         => true,
            CURLOPT_SSL_VERIFYPEER      => false,
            CURLOPT_URL                 => $url,
            CURLOPT_USERAGENT           => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0',
            CURLOPT_HTTPHEADER          => array
            (
                'Accept-Language: en-US;q=0.6,en;q=0.4',
                'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
            )
        ));

        return curl_exec($curl);
    }
    catch(Exception $exception)
    {
        echo $exception;
    }
}

這是我用來調用它的代碼:

$curl = curl_init();
http_request($curl, "http://host.com/url1");
http_request($curl, "http://host.com/url2", "postdata=123");
http_request($curl, "http://host.com/url3");
http_request($curl, "http://host.com/url4");
curl_close($curl);

這是我得到的輸出:

GET  http://host.com/url1
POST http://host.com/url2
GET  http://host.com/url3
GET  http://host.com/url4

到目前為止一切順利,但是使用數據包分析器(wireshark),輸出看起來像這樣:

POST http://host.com/url1
Content-Length: 0;

POST http://host.com/url2
Content-Length: 12;

POST http://host.com/url3
Content-Length: 0;

POST http://host.com/url4
Content-Length: 0;

然后我重寫了這樣的代碼:

function http_request($curl, $url, $post = null)
{
    echo (isset($post) ? 'POST ' . $url : 'GET ' . $url) . PHP_EOL;

    try
    {
        $cookie_path = tempnam(null, 'b');

        curl_setopt_array($curl, array
        (
            CURLOPT_COOKIEFILE          => $cookie_path,
            CURLOPT_COOKIEJAR           => $cookie_path,
            CURLOPT_COOKIESESSION       => true,
            CURLOPT_RETURNTRANSFER      => true,
            CURLOPT_FOLLOWLOCATION      => true,
            CURLOPT_HEADER              => true,
            CURLOPT_AUTOREFERER         => true,
            CURLOPT_SSL_VERIFYPEER      => false,
            CURLOPT_URL                 => $url,
            CURLOPT_USERAGENT           => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0',
            CURLOPT_HTTPHEADER          => array
            (
                'Accept-Language: en-US;q=0.6,en;q=0.4',
                'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
            )
        ));

        if($post != null)
        {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        }
        else
        {
            curl_setopt($curl, CURLOPT_POST, false);
            curl_setopt($curl, CURLOPT_POSTFIELDS, null);
        }

        return curl_exec($curl);
    }
    catch(Exception $exception)
    {
        echo $exception;
    }
}

但是如果我從函數中刪除此代碼,仍然會發生同樣的事情:

        if($post != null)
        {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        }
        else
        {
            curl_setopt($curl, CURLOPT_POST, false);
            curl_setopt($curl, CURLOPT_POSTFIELDS, null);
        }

在數據包分析器中,我得到:

GET  http://host.com/url1
GET  http://host.com/url2
GET  http://host.com/url3
GET  http://host.com/url4

即使第一個請求未設置,如何在第一個請求上將其設置為POST也沒有意義。 謝謝!

我隱約記得前段時間我也遇到過同樣的問題。 嘗試也明確設置CURLOPT_HTTPGET

    if($post != null)
    { 
        curl_setopt($curl, CURLOPT_HTTPGET, false);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    }
    else
    {
        curl_setopt($curl, CURLOPT_HTTPGET, true);
        curl_setopt($curl, CURLOPT_POST, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, null);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM