2011-03-21 108 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