从Web服务器提交时CURL错误请求400

时间:2014-04-24 17:27:40

标签: php curl

我正在尝试使用curl将表单提交到.aspx页面,然后对响应执行某些操作。问题是我的代码在我从本地xampp服务器提交时有效,但是当从webserver提交时,我得到“HTTP错误400.请求URL无效”。 我尝试删除CURLOPT_POST选项,在SO上找到它。我也尝试过urlencoding,但后来我什么都没得到。

$url = "http://www.somepage.com/locations/default.aspx#location_page_map";
$kv[]='search=92627';
$kv[]='__VIEWSTATE';
$kv[]='__EVENTTARGET';
$query_string = join("&", $kv);
$ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_HEADER, FALSE);
 curl_setopt($ch, CURLOPT_POST, count($kv));
 curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT   5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);

2 个答案:

答案 0 :(得分:1)

你实际上可以省略__VIEWSTATE__EVENTTARGET那里很可能与ASP的表单值持久性有关的东西,你也可以删除#location_page_map只是为了将页面聚焦在地图部分,因此不会影响您尝试刮取的服务/网站的结果。然后使用http_build_query()将数组转换为curl的字符串。

<?php 
//$url = "http://www.myfitfoods.com/locations/default.aspx#location_page_map";

$url = "http://www.somepage.com/locations/default.aspx#location_page_map";

$kv['search'] = '92627';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, count($kv));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($kv));
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT   5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
$output = curl_exec($ch);
var_dump($output);
curl_close($ch);

答案 1 :(得分:0)

您尚未定义$kv数组属性。 Curl将采用数组,但必须采用key=>value格式。您提供的只有3个值。例如你实际上正在传递

=search%3D62627&=__VIEWSTATE&=__EVENTTARGET
^--no key       ^---no key   ^--- no key

尝试:

$kv = array(
   'search' => 92627,
   'x' => '__VIEWSTATE',
   'y' => '__EVENTTARGET'
)
curl_setopt($ch, CURL_POSTFIELDS, $kv);

或类似的。