Php cURL将数据发布到asp.net页面
我试图使用curl从php调用asp.net页面中的Php cURL将数据发布到asp.net页面,php,asp.net,curl,viewstate,Php,Asp.net,Curl,Viewstate,我试图使用curl从php调用asp.net页面中的\uuu doPostbackjavascript函数 我了解到,这可以通过使用适当的参数向asp.net页面发出post请求来实现 所以在卷曲中 我发出了一个get请求/只需使用file\u get\u contents检索初始页面 从中,我提取了\uuu VIEWSTATE和\uu EVENTVALIDATION的值 到目前为止,一切似乎都很好 现在,我了解到我们需要使用cURL和\uuu VIEWSTATE以及其他所需参数发出post请求
\uuu doPostback
javascript函数
我了解到,这可以通过使用适当的参数向asp.net页面发出post请求来实现
所以在卷曲中
file\u get\u contents
检索初始页面\uuu VIEWSTATE
和\uu EVENTVALIDATION
的值\uuu VIEWSTATE
以及其他所需参数发出post请求。(asp.net表单中的字段值)
我无法正确构造CURLOPT_POSTFIELDS
比如说我在试这个,
$postoptions1='__EVENTTARGET='.('ctl00$ContentPlaceHolder1$gRef').'&__EVENTARGUMENT='.('$2');
$postoptions2 = '&__VIEWSTATE='.urlencode($viewState) ;
$otherparams = '&ctl00$ContentPlaceHolder1$ddlName=Abc';
在使用setopt forCURLOPT_POSTFIELDS
之前,我要
urlencode ($postoptions1.$postoptions2.$otherparams)
这是行不通的。未显示提交结果,这意味着在我的post请求中未找到所需的参数\u VIEWSTATE
如果我更改参数的顺序并将\uuu VIEWSTATE
作为第一个参数,则会显示结果页面,但不接受其他参数值
我认为我对参数的编码方式存在一些问题
请告诉我如何为asp.net页面的post请求构造参数
谢谢
--编辑--
以下是完整的代码:
$resultsPerPage='10';
$url=“www.example.com”;//url已更改
$curl\u connection=curl\u init($url);
函数sendCurl($curl\u connection,$url,$params,$isPost=false){
$response1=sendCurl($curl\u connection,$url',,false);
$viewState=getVStateContent($response1);
$eventValidation=getEventValidationContent($response1);
$simpleParams='&$VIEWSTATE='.$VIEWSTATE.&ctl00$ContentPlaceholder 1$ddlManuf=&ctl00$ContentPlaceholder 1$ddlCrossType=&ctl00$ContentPlaceholder 1$ddlPageSize='.$resultsPerPage.&ctl00$ContentPlaceholder 1$btnSearch=Search&ctl00$ToolkitScriptManager1\u隐藏字段=&&ctl00$ContentPlaceholder=&
//第二篇文章-用于提交搜索表单
$response2=sendCurl($curl\u connection,$url,$simpleParams,true);
----**您想要的是,它将数组格式化为正确的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$contentPlaceholder 1$ddlName应该是什么?不要对将参数链接在一起的符号和(&)进行URL编码,只对键和值(符号两边的内容)进行编码.这对我的情况没有帮助。以下是输出:uuu VIEWSTATE=0k1ruWH%2BzSOHSG0KOY6JHOZADKpmu9SYIVMMWxJ0FFA9QHWJddg%2Bf2URv%2FGqnsfcIbapMhbqUg%3D%3D和uu EVENTVALIDATION=JV9XLRMGGTR14SQKFS8ZMJ0ZMJ0AO5LSOP41VY4KIKNc1IYMBB9JEC4YR3S%2FAKBKWfKJ1FKGJ0KJ0KJ0KJ0KJ0KJ0KJ0KJ0KJ0KJ0KJ0KJ0J0J0J0J0J0KJ0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0J0KoolkitScriptManager1\u HiddenField=&ctl00%24contentplaceholder 1%24name=&ctl00%24contentplaceholder 1%24type=&ctl00%24contentplaceholder 1%size=10&ctl00%24contentplaceholder%24btnSearch=Search&\uuuuuuu EVENTTARGET=&uuuuuuu EVENTARGUMENT=。我得到一个找不到的页面。如果返回了404页面,那么您使用的URL可能不是实际的资源。我将但是,如果没有更多上下文,则无法判断。此查询字符串有效(我无法获取未找到的页面),但只考虑第一个参数:uu VIEWSTATE%252fgrlmfujxphs2es6bzvvyvkwm62acgq7cyd%252f1aquiohywq%253D%253D%253D%26_u事件目标%3Dctl00%24ContentPlaceHolder1%24gvCrossRef%26_u事件参数%3DPage%242%26ctl00%2524ContentPlaceHolder1%2524c%2524ctl00%2524ContentPlaceHolder1%3D%26ctl00%2524ContentPlaceholder 1%2524size%3D10%26ctl00%2524ContentPlaceholder 1%2524btnSearch%3DSearch%26ctl00\u ToolkitScriptManager1\u HiddenField%3您是否在运行
http\u build\u query
后执行urlencode
?因为您不应该这样做。更新了我的答案以反映整个事情的样子。我尝试了这个方法。查询字符串看起来像如下所示:视图状态=%2FM2fyvIXCicvzPxQrhT%2BVHnkc1NnV609%2FMiR97D%2Ft7%2fcjn22zlo2rieabwd25a%2Fc%2bgahtefb4lmas5czm2lj7kasn7qmlk1xgektfodhztnlzvd4asrp5qoowvkpoydsh2mqjyfv8oyhr5lkj53zykek0pw1pw1n5stlia5y1%2f1cqgawlac&ctlu工具脚本管理器HiddenField=&24ctlu%24ctl1%24ctl00%24内容占位符类型ContentPlaceholder 1%24size=10&ctl00%24ContentPlaceholder 1%24btnSearch=Search&&\uuuu事件目标=&\uuuu事件参数=。我获取未找到页面错误。
$params = array(
'__EVENTTARGET' => 'ctl00$ContentPlaceHolder1$gRef',
'__EVENTARGUMENT' => '$2',
'__VIEWSTATE' => $viewState,
'ctl00$ContentPlaceHolder1$ddlName' => 'Abc'
);
curl_setopt($curlHandler, CURLOPT_POSTFIELDS, http_build_query($params));