【问题标题】:How to emulate Ajax request using PHP CURL?如何使用 PHP CURL 模拟 Ajax 请求?
【发布时间】:2015-07-27 12:22:21
【问题描述】:

当我发送 Ajax 请求时收到 400 http_code 错误,下面的 CURL 是我的代码。

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

// 我在发出 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] => 
)
//// 

【问题讨论】:

  • 400 表示这是一个错误的请求。弄清楚什么是坏的。也许是一个糟糕的标题?
  • 是的,你是对的,这是客户端错误,但如果我没有设置标题,它会给出 500 http_code,我还尝试了许多组合来制作标题... :)
  • 你能把你的问题缩小到一个最小的例子吗?
  • @cmbarbu 现在我缩小了我的代码。请看一下
  • 你的 $data_url 是什么?而且我认为Host和Referer应该不同。主机是您正在卷曲的域:domain.com

标签: javascript php ajax curl


【解决方案1】:

我不确定它是否会对您有所帮助,但我能够使用以下代码成功查询 SSL 站点。 有几个东西,比如用户代理、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);

后续调用请求(注意是第一次请求生成的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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2023-03-31
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多