2011-03-21 107 views
4

我想從curl中使用curl在php中的asp.net頁面中調用__doPostback javascript函數。cURL發佈數據到asp.net頁面

我瞭解到,這可以通過使用適當的參數向asp.net頁面發佈發佈請求來完成。

所以捲曲,

  1. 我做一個GET請求/只使用file_get_contents檢索初始頁面。
  2. 由此,我提取了__VIEWSTATE__EVENTVALIDATION的值。

到目前爲止一切似乎都沒問題。

現在,我明白我們需要使用cURL發出請求,並且需要__VIEWSTATE和其他參數。 (asp.net窗體中的字段值)

我無法正確構建CURLOPT_POSTFIELDS

舉例來說,我想這一點,

而且使用SETOPT爲CURLOPT_POSTFIELDS之前,我做的,

urlencode ($postoptions1.$postoptions2.$otherparams) 

這是行不通的。提交結果未顯示,這意味着在我的發佈請求中未找到所需的參數__VIEWSTATE

如果我更改參數的順序並將__VIEWSTATE作爲第一個參數,將顯示結果頁面,但其他參數值不符合。

我認爲我編碼參數的方式存在一些問題。

請告訴我如何構建發佈到asp.net頁面的請求的參數。

謝謝。

--Edited--

下面是完整的代碼: $ resultsPerPage = '10' ; $ url =「www.example.com」; // url changed

$ curl_connection = curl_init($ url); 功能sendCurl($ curl_connection,$網址,$參數,可以$ isPost = FALSE){

//$post_string = $params; 
$post_string = http_build_query($params); 
//$post_string = build_query_string($params); 
//$post_string = urlencode($params); 

echo 'After Encode'.$post_string; 
    $cookie="/cookie.txt"; 


    //set options 
    curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 300); 
    curl_setopt($curl_connection, CURLOPT_USERAGENT, 
     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
    curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl_connection, CURLOPT_HEADER, 0); // don't return headers 

    curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($curl_connection,CURLOPT_REFERER, $url); 
    if($isPost) { 
     curl_setopt ($curl_connection, CURLOPT_POST, true); 
     //set data to be posted 
     curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 
     curl_setopt($curl_connection,CURLOPT_COOKIEJAR,$cookie); 

    } 
    else { 
    curl_setopt($curl_connection,CURLOPT_COOKIEFILE,$cookie); 
    } 
    $response1 = curl_exec($curl_connection); 
    if($response1 === false) 
    { 
     echo 'Curl error: ' . curl_error($curl_connection); 
    } 
    else 
{ 
    echo 'Operation completed without any errors'; 
} 
    return $response1; 
} **// First time, get request to asp.net page 

$response1 = sendCurl($curl_connection,$url,'',false);
$viewState=getVStateContent($response1);
$eventValidation =getEventValidationContent($response1);
$simpleParams = '&__VIEWSTATE='.$viewState.'&ctl00$ContentPlaceHolder1$ddlManuf=&ctl00$ContentPlaceHolder1$ddlCrossType=&ctl00$ContentPlaceHolder1$ddlPageSize='.$resultsPerPage.'&ctl00$ContentPlaceHolder1$btnSearch=Search&ctl00_ToolkitScriptManager1_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=';
// Second post - for submitting the search form
$response2= sendCurl($curl_connection,$url,$simpleParams,true);
---- **

回答

1

你想要的是http_build_query,將格式化數組正確的HTTP參數。

編輯:澄清一下這個可能應該是這樣的:

$params = array(
    '__EVENTTARGET' => 'ctl00$ContentPlaceHolder1$gRef', 
    '__EVENTARGUMENT' => '$2', 
    '__VIEWSTATE' => $viewState, 
    'ctl00$ContentPlaceHolder1$ddlName' => 'Abc' 
); 

curl_setopt($curlHandler, CURLOPT_POSTFIELDS, http_build_query($params)); 

而且,什麼ctl00$ContentPlaceHolder1$ddlName應該是什麼?

+0

這並沒有幫助我的情況。下面是輸出:__VIEWSTATE = 0k1ruWH%2BzSohS0G0kOy6JhOZxeadZDkpmU9syivmmwxj0FfA9qHwJSDDG%2Bf2URv%2FGqnsfcIbapMhbqUg%3D%3D&__ EVENTVALIDATION = JV9xlRMggTR14sqkFT0zMJ0aO5LSOp41vy4kIKnCMwIoNnh1SiyeMUgcbb9J1jec4S8Yr3s%2FakWbjbgsLZLa081BYSObgoLU17lL1YEaCLj0dKhrduupil4RSqqURfGbj%2FIpfqtjsD%2BHxC2ZcfddlJFhMZdh&ctl00_ToolkitScriptManager1_HiddenField =&ctl00%24ContentPlaceHolder1%24name =&ctl00%24ContentPlaceHolder1%24type =&ctl00%24ContentPlaceHolder1%大小= 10&ctl00%24ContentPlaceHolder1%24btnSearch =搜索&__ EVENTTARGET =&__ EVENTARGUMENT =。我收到一個找不到頁面。 – 2011-03-22 03:22:55

+0

如果返回404頁面未找到,那麼您使用的URL可能不是實際的資源。但是,如果沒有更多的上下文,我將無法分辨。 – 2011-03-22 03:29:12

+0

這個查詢字符串作品(我不明白找不到頁面),但只有第一個參數被認爲是:__VIEWSTATE%252FgRlmFUjXphs2ES6bzvyvKWm62AcGQ7cyD%252F1aAQuioHYWQ%253D%253D%26__EVENTTARGET%3Dctl00%24ContentPlaceHolder1%24gvCrossRef%26__EVENTARGUMENT%3DPage%242%26ctl00%2524ContentPlaceHolder1%2524txtSearch %3DExar%26ctl00%2524ContentPlaceHolder1%2524name%3D%26ctl00%2524ContentPlaceHolder1%2524ddltype%3D%26ctl00%2524ContentPlaceHolder1%2524size%3D10%26ctl00%2524ContentPlaceHolder1%2524btnSearch%3DSearch%26ctl00_ToolkitScriptManager1_HiddenField%3D – 2011-03-22 03:46:46

0

請不要將urlencode()和(&)鏈接在一起的參數,只是鍵值&值(&符號兩邊的東西)。

+0

我試過了。查詢字符串看起來是這樣的:__VIEWSTATE =%2FM2fyvIXCicvzPxQrhT%2BVHnkc1NnV609%2FMiR97D%2Ft7%2FCJN22ZLO2E3rieAbWd25A%2FC%2Bgaahtefb4LMAs5cZm2Lj7KaSn7qmlk1XgeKTFodhzTnLzvd4aSRP5GqOEuWVKPODsh2SMQtJYfLKfvUFs8oYhr5LKJ53zXyEKcQ0PW1n5StLIA5Y1%2FgAwlAc&ctl00_ToolkitScriptManager1_HiddenField = ctl00%24ContentPlaceHolder1%24name = ctl00%24ContentPlaceHolder1%24type = ctl00%24ContentPlaceHolder1%24size = 10 ctl00%24ContentPlaceHolder1%24btnSearch =搜索&__ EVENTTARGET =&__ EVENTARGUMENT =。我得到頁面未找到錯誤。 – 2011-03-22 04:00:34