【问题标题】:cURL post data to asp.net pagecURL 将数据发布到 asp.net 页面
【发布时间】:2011-03-21 22:47:37
【问题描述】:

我正在尝试使用 curl 从 php 调用 asp.net 页面中的 __doPostback javascript 函数。

我了解到这可以通过使用适当的参数向 asp.net 页面发出 post 请求来完成。

所以在 curl 中,

  1. 我提出了一个获取请求/只需使用file_get_contents 来检索初始页面。
  2. 从中提取__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


    【解决方案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 应该是什么?

    【讨论】:

    • 这对我没有帮助。下面是输出:__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=。我得到一个页面未找到。
    • 如果返回 404 Page Not Found,那么您使用的 URL 可能不是实际资源。但是,如果没有更多上下文,我将无法判断。
    • 这个查询字符串有效(我没有找到页面未找到),但只考虑第一个参数:__VIEWSTATE%252FgRlmFUjXphs2ES6bzvyvKWm62AcGQ7cyD%252F1aAQuioHYWQ%253D%253D%26__EVENTTARGET%3Dctl00%24ContentrosD%26%24g 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 跨度>
    • 你在运行http_build_query 之后是urlencodeing 吗?因为你不应该。
    • 更新了我的答案以反映整个事情的样子。
    【解决方案2】:

    不要 urlencode() 将参数链接在一起的与号 (&),只需要键和值(与号两侧的东西)。

    【讨论】:

    • 我试过这个。查询字符串看起来像这样:__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=。我收到页面未找到错误。
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2011-07-11
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多