通过CURL发送ajax请求

时间:2018-01-11 19:23:17

标签: php jquery ajax curl

需要发送API请求。出于某种原因,服务器阻止了CURL请求,但它批准了XHR ajax请求。我可以发送ajax请求,但是出现了另一个问题 - 混合内容我的网站是通过HTTPS提供的,但是需要发送的请求是通过HTTP进行的,所以我不能使用ajax。

我正在寻找一种通过CURL模拟ajax请求的方法,在某种程度上,欺骗服务器相信CURL请求确实是一个ajax请求。

这是我尝试过的。

这是我的CURL请求。

$ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64)');
    curl_setopt($ch, CURLOPT_REFERER, 'server's url');
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept:application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding:gzip, deflate',
    'Accept-Language:en-US,en;q=0.9',
    'Connection:keep-alive',
    'Content-Type: application/json; charset=utf-8',
    'X-Requested-With: XMLHttpRequest',
    '__RequestVerificationToken: $token'
    ));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, base_path().'/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, base_path().'/cookies.txt');
    $buffer = curl_exec($ch);
    if(curl_error($ch))
    {
    $buffer =   curl_error($ch);
    }
    curl_close($ch);

返回$ buffer; 这个卷曲请求被阻止

但是,这个ajax请求通过我的localhost,但由于我的实时网站使用HTTPS,我无法真正使用它。

 $.ajax({
      type: "get",
      xhrFields: { withCredentials:true },
      url: http://apiendpoint.com,
      success: function(data)
      {
       // console.log(data);
      }
})

3 个答案:

答案 0 :(得分:7)

在chrome中,您可以从开发人员工具栏中复制工作卷曲表达式。尝试使用cli中的那个。如果可行,您可以确定哪些部件是必需的,哪些部件不是。然后你可以把它转录成php。

developer toolbar -> network -> select a file -> right click - copy -> copy as curl

如果您怀疑从php发生的事情是否与curl相同,请使用requestbin进行尝试。

答案 1 :(得分:0)

我认为令牌的标头可能不是您认为的那样,因为给定$ a == 1,'$ a'转换为$ a,但“$ a”转换为“1”(通知单引号与双引号)。

在您的示例中,请尝试替换:

'__RequestVerificationToken: $token'

使用:

"__RequestVerificationToken: $token"

并告诉我们是否能解决问题。

考虑使用passthru(“curl command here ...”);使用lintabá的建议

答案 2 :(得分:-1)

您可以使用2阶段请求

1 curl .... -c ${cookie_file}

2 curl .... -b ${cookie_file} -c ${cookie_file}

这应该有效。 首先是基本获取会话ID的cookie 第二个做真正的请求