Php 通过CURL发送ajax请求

Php 通过CURL发送ajax请求,php,jquery,ajax,curl,Php,Jquery,Ajax,Curl,需要发送API请求。出于某种原因,服务器正在阻止CURL请求,但它批准了一个XHR ajax请求。我可以发送一个ajax请求,但另一个问题出现了——混合内容我的网站是通过HTTPS提供的,但需要发送的请求是通过HTTP的,所以我不能使用ajax 我正在寻找一种通过CURL模拟ajax请求的方法,在某种程度上,欺骗服务器相信CURL请求确实是ajax请求 这是我试过的 这是我的要求 $ch=curl_init(); curl_setopt($ch,CURLOPT_USERAGENT,'Mozill

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

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

这是我试过的

这是我的要求

$ch=curl_init();
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0(X11;Linux x86_64)');
curl_setopt($ch,CURLOPT_REFERER,'服务器的url');
curl_setopt($ch,CURLOPT_AUTOREFERER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
'接受:application/json,text/javascript,*/*;q=0.01',
'接受编码:gzip,deflate',
'接受语言:en-US,en;q=0.9',
“连接:保持活动状态”,
'内容类型:application/json;charset=utf-8',
“X-request-With:XMLHttpRequest”,
“\uuu 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\u exec($ch);
if(旋度误差($ch))
{
$buffer=curl\u错误($ch);
}
卷曲关闭($ch);
返回$buffer;
此卷曲请求已被阻止

但是,这个ajax请求通过我的localhost进行,但是由于我的live网站使用HTTPS,所以我无法真正使用它

$.ajax({
键入:“获取”,
xhrFields:{withCredentials:true},
网址:http://apiendpoint.com,
成功:功能(数据)
{
//控制台日志(数据);
}
})

在chrome中,您可以从开发者工具栏复制一个工作curl表达式。试试cli中的那个。如果这样做有效,您可以确定哪些零件是必需的,哪些零件不是必需的。然后您可以将其转录到php


如果您怀疑php中是否发生了与curl中相同的事情,请尝试一下。

我认为令牌的标题可能不是您所认为的那样,因为给定$a==1,$a'转换为$a,“$a”转换为“1”(请注意单引号与双引号)

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

'__RequestVerificationToken: $token'
与:

让我们知道这是否解决了问题


考虑使用passthru(“这里的curl命令…”);使用lintabá的建议

您可以使用两阶段请求

1
curl-c${cookie_file}

2
curl-b${cookie\u文件}-c${cookie\u文件}

这应该行得通。 首先是基本上获取会话id为的cookie
第二,是否执行真正的请求

您如何知道它已被阻止?(即,与不工作相比?)您得到的HTTP状态是什么?通过ajax请求收到的响应是
success
,而curl请求响应是
invalid
试试这个->curl_setopt($ch,CURLOPT_HTTPHEADER,array(“X-request-With:XMLHttpRequest”,“内容类型:application/json;charset=utf-8”);如果您在响应中看到文本“invalid”,那么您没有被阻止。请求已完成,您将收到一条失败消息。请尝试使用
-v
(对于命令行)运行curl,或运行
curl\u getinfo()
(对于PHP curl)以转储额外信息。@如果xhr来自浏览器,并且具有发送到服务器的会话和cookie。打开开发人员工具并查看ajax调用的请求头-我猜您会在那里看到cookies。作为测试,您应该能够(在chrome中,我知道您可以)
copyascurl
在命令行上运行命令。它将从浏览器中添加相关cookie和标题。如果在php代码中添加这些,可能会奏效,但这不是长期的解决方案,因为每个人都会发生变化。我这样做,我尝试使用相同的标题,但没有效果。从未使用过requestbin,我如何使用它?我如何比较我的curl请求和浏览器请求?-在requestbin上创建一个bin。(这将为您提供一个url)-用curl请求中的给定url替换原始url并执行它-检查requestbin上的结果-使用ajax从您的站点向requestbin url发送请求-也检查新url-比较两个结果谢谢,很好的工具。我尝试发送与requestbin接收到的标题完全相同的标题,但仍然不起作用:(我已经用有问题的URL更新了这个问题,你能检查一下并让我知道你是否能解决它吗谢谢你。但是没有
$token
变量,我看到一个例子提到了这个标题,并明确说明了
$token
,所以我也尝试了这个标题。所以这不是给出问题的真正代码,而是读取某种形式的伪代码?@zuif您是否应该发布不起作用的代码(隐藏任何合理的数据),以便我们可以尝试调试it@CliffBurton我已经用问题中的URL更新了这个问题,你能检查一下并让我知道你是否能解决它为什么不在标题中的:后面加空格?
"__RequestVerificationToken: $token"