简体   繁体   English

如何使用 PHP CURL 模拟 Ajax 请求?

[英]How to emulate Ajax request using PHP CURL?

I am getting 400 http_code error when I send a Ajax request with CURL below is my Code.当我发送带有以下 CURL 的 Ajax 请求时,我收到 400 http_code 错误是我的代码。

    $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);

// I am getting following response after making Curl request // 发出 Curl 请求后,我得到以下响应

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] => 
)
//// 

I am not sure it would help you but i am able to successfully query SSL site with the following code.我不确定它是否会对您有所帮助,但我能够使用以下代码成功查询 SSL 站点。 There are several things like user agent, cookiefile, SSL verify, url form encoded for post data and subsequent request should use the same cookie and agent data有几个东西,如用户代理、cookiefile、SSL 验证、为发布数据编码的 url 表单和后续请求应该使用相同的 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);

Subsequent call request(note it is using the cookie, useragent generated in first request)后续调用请求(注意是第一次请求生成的cookie,useragent)

$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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM