php - cURL 将数据发布到 asp.net 页面

标签 php asp.net curl viewstate

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

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

所以在 curl 中,

  1. 我发出一个获取请求/只使用file_get_contents检索初始页面。
  2. 由此,我提取了 __VIEWSTATE 的值和 __EVENTVALIDATION .

目前一切正常

现在,我明白我们需要使用带有 __VIEWSTATE 的 cURL 发出一个 post 请求和其他需要的参数。 (存在于 asp.net 表单中的字段的值)

我无法构建 CURLOPT_POSTFIELDS正确。

例如,我正在尝试这个,

$postoptions1='__EVENTTARGET='.('ctl00$ContentPlaceHolder1$gRef').'&__EVENTARGUMENT='.('$2');
$postoptions2 =  '&__VIEWSTATE='.urlencode($viewState) ;
$otherparams = '&ctl00$ContentPlaceHolder1$ddlName=Abc';

在对 CURLOPT_POSTFIELDS 使用 setopt 之前,我在做,

urlencode ($postoptions1.$postoptions2.$otherparams)

这是行不通的。未显示提交结果,这意味着需要的参数 __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);<br/> $viewState=getVStateContent($response1);<br/> $eventValidation =getEventValidationContent($response1);<br/> $simpleParams = '&__VIEWSTATE='.$viewState.'&ctl00$ContentPlaceHolder1$ddlManuf=&ctl00$ContentPlaceHolder1$ddlCrossType=&ctl00$ContentPlaceHolder1$ddlPageSize='.$resultsPerPage.'&ctl00$ContentPlaceHolder1$btnSearch=Search&ctl00_ToolkitScriptManager1_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=';<br/> // Second post - for submitting the search form<br/> $response2= sendCurl($curl_connection,$url,$simpleParams,true); ----**

最佳答案

你要的是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 应该是什么?

关于php - cURL 将数据发布到 asp.net 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384655/

相关文章:

javascript - 如何从下拉列表中获取所选文本的第一个字符并将其放入文本框中?

c# - ASP.Net 网站项目的程序集名称

php - cURL,curl_multi_init 是多线程还是异步 API?

curl: (48) 一个未知的选项被传递给 libcurl

php - 有没有办法使用 Laravel 5 迁移创建 citext 字段?

phpMyAdmin 和 mysql 未显示相同的用户或数据库

C# - 发送邮件失败

javascript - OnClientClick 调用两个函数

PHP Multi Curl curl_multi_select 减慢进程。另一种选择工作得更快但有缺陷?

php - jQuery Mobile 的内部/外部链接问题