2015-05-15 47 views
1

我收到400 http_code错误,当我发送一个Ajax请求与CURL下面是我的代码。如何使用PHP CURL模拟Ajax请求?

$header = array(
    "Accept : application/json, text/javascript, */*; q=0.01", 
    "Accept-Encoding : gzip, deflate", 
    "Accept-Language : en-US,en;q=0.5", 
    "Content-Type : application/json; charset=UTF-8", 
    "Host : https://some.com", 
    "Referer : https://some.com/dashboard/reports", 
    "X-Requested-With : XMLHttpRequest" 
    ); 
    $c  = curl_init('https://domain.com/report.php'); 
    //curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); 
    //curl_setopt($c, CURLOPT_VERBOSE, true); 

    curl_setopt($c, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($c, CURLOPT_POST, true); 
    curl_setopt($c, CURLOPT_POSTFIELDS, $data_url); 
    curl_setopt($c, CURLOPT_HTTPHEADER, $header); 
    //curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest")); 

    curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_jar); 
    $page  = curl_exec($c); 
    $httpcode = curl_getinfo($c); 

//我在做卷发要求

Array 
(
    [url] => some_url 
    [content_type] => 
    [http_code] => 400 
    [header_size] => 70 
    [request_size] => 935 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0.205562 
    [namelookup_time] => 0.000132 
    [connect_time] => 0.032866 
    [pretransfer_time] => 0.170225 
    [size_upload] => 272 
    [size_download] => 0 
    [speed_download] => 0 
    [speed_upload] => 1323 
    [download_content_length] => 0 
    [upload_content_length] => 272 
    [starttransfer_time] => 0.205498 
    [redirect_time] => 0 
    [certinfo] => Array 
     (
     ) 

    [primary_ip] => 66.35.58.70 
    [primary_port] => 443 
    [local_ip] => 198.1.92.85 
    [local_port] => 53627 
    [redirect_url] => 
) 
//// 
+0

'400'表示这是一个不好的请求。找出什么是坏的。也许是一个坏头? – Halcyon

+0

是的,你是正确的,这是客户端错误,但如果我没有设置标题,它给了500 http_code,我也尝试了很多组合,使头... :) –

+0

你能缩小你的问题的一个最小的例子吗? – cmbarbu

回答

0

后得到如下回应我不知道它会帮助你,但我能够成功地查询SSL站点用下面的代码。 有几件事情,如用户代理,cookiefile,SSL验证,编码的POST数据和后续请求应该使用它使用的cookie相同的cookie和代理数据

$config['useragent'] = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'; 
$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_USERAGENT, $config['useragent']); 
curl_setopt($ch, CURLOPT_REFERER, 'http://google.com/'); 
$dir = dirname(__FILE__); 
$config['cookie_file'] = $dir."/".md5($_SERVER['REMOTE_ADDR']) . '.txt'; 
curl_setopt($ch, CURLOPT_COOKIEFILE, $config['cookie_file']); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $config['cookie_file']); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_NOBODY, 0);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_HEADER,0); 
$html=curl_exec($ch); 

随后的呼叫请求(注意URL格式,用户代理在第一个请求中生成)

$post = 'city_id=3&length-3'; 
$headers = array(); 
$headers[] = 'Accept: application/json, text/javascript, */*; q=0.01'; 
$headers[] = 'Accept-Language: en-US,en;q=0.5'; 
$headers[] = 'Content-Length:'.strlen($post); 
$headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8'; 
$headers[] = 'X-Requested-With: XMLHttpRequest'; 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,$link); 
curl_setopt($ch, CURLOPT_USERAGENT, $config['useragent']);   
curl_setopt($ch, CURLOPT_COOKIEFILE, $config['cookie_file']); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $config['cookie_file']); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_NOBODY, 0);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_HEADER,0); 
$linkhtml=curl_exec($ch);