【发布时间】:2018-06-21 05:13:57
【问题描述】:
需要发送 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);
return $buffer;
此 curl 请求被阻止
但是,这个 ajax 请求通过我的本地主机,但由于我的实时网站使用 HTTPS,我无法真正使用它。
$.ajax({
type: "get",
xhrFields: { withCredentials:true },
url: http://apiendpoint.com,
success: function(data)
{
// console.log(data);
}
})
【问题讨论】:
-
你怎么知道它被屏蔽了? (即,与根本不工作?)你得到什么 HTTP 状态?
-
通过ajax请求收到的响应是
success,而curl请求响应是invalid -
试试这个 -> curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest", "Content-Type: application/json; charset=utf-8"));
-
如果您在响应中看到文本“无效”,那么您并没有被阻止。请求已完成,您收到一条失败消息。尝试使用
-v(用于命令行)运行 curl 或运行curl_getinfo()(用于 PHP curl)以转储额外信息。 -
@zuif xhr 来自浏览器,并具有发送到服务器的会话和 cookie。打开开发人员工具并查看 ajax 调用的请求标头 - 我怀疑您会在那里看到 cookie。作为测试,您应该能够(在 chrome 中我知道您可以)
copy as curl在命令行上运行该命令。它将添加来自浏览器的相关 cookie 和标头。如果您将这些添加到您的 php 代码中,它可能会起作用,但这不是长期的解决方案,因为它会因每个人而异。