【发布时间】:2011-03-21 22:47:37
【问题描述】:
我正在尝试使用 curl 从 php 调用 asp.net 页面中的 __doPostback javascript 函数。
我了解到这可以通过使用适当的参数向 asp.net 页面发出 post 请求来完成。
所以在 curl 中,
- 我提出了一个获取请求/只需使用
file_get_contents来检索初始页面。 - 从中提取
__VIEWSTATE和__EVENTVALIDATION的值。
到目前为止一切正常。
现在,我知道我们需要使用带有__VIEWSTATE 和其他所需参数的 cURL 来发出发布请求。 (asp.net 表单中的字段值)
我无法正确构造CURLOPT_POSTFIELDS。
例如,我正在尝试这个,
$postoptions1='__EVENTTARGET='.('ctl00$ContentPlaceHolder1$gRef').'&__EVENTARGUMENT='.('$2');
$postoptions2 = '&__VIEWSTATE='.urlencode($viewState) ;
$otherparams = '&ctl00$ContentPlaceHolder1$ddlName=Abc';
在将 setopt 用于CURLOPT_POSTFIELDS 之前,我正在这样做,
urlencode ($postoptions1.$postoptions2.$otherparams)
这不起作用。提交结果没有显示,说明我的post请求中没有找到需要的参数__VIEWSTATE。
如果我更改参数的顺序并将__VIEWSTATE 作为第一个参数,则会显示结果页面,但不会使用其他参数值。
我认为我编码参数的方式存在一些问题。
请告诉我如何为asp.net页面的post请求构造参数。
谢谢。
--已编辑--
完整代码如下: $resultsPerPage='10'; $url = "www.example.com"; // 网址改变了
$curl_connection = curl_init($url); 函数 sendCurl($curl_connection,$url,$params,$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);
【问题讨论】:
标签: php asp.net curl viewstate