通过名为PHP脚本的AJAX执行CURL请求
我很难理解为什么通过AJAX请求调用已知正在工作的CURL请求时不工作 假设我们有一个curl.php文件,它执行一些curl请求。内容如下:通过名为PHP脚本的AJAX执行CURL请求,php,jquery,ajax,curl,Php,Jquery,Ajax,Curl,我很难理解为什么通过AJAX请求调用已知正在工作的CURL请求时不工作 假设我们有一个curl.php文件,它执行一些curl请求。内容如下: <?php $c = curl_init(); curl_setopt($c, CURLOPT_URL, "https://www.somewebsite.com/somescript.cgi"); // set the URL curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // retur
<?php
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.somewebsite.com/somescript.cgi"); // set the URL
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // return the result instead of outputting it
$output = curl_exec($c);
curl_close($c);
?>
CURL请求应该触发远程服务器上的某个操作(在本例中,它调用cgi脚本,该脚本在某个远程数据库中插入一条记录)
更新:为了执行远程cgi脚本,必须从远程网站将cookie设置到我的浏览器。(确实如此-已设置所述cookie)
如果我单独运行curl.php脚本,其中的curl请求工作得很好(远程操作被触发)。然而,如果我通过AJAX异步调用它,尽管我从中得到的输出与单独执行curl.php脚本时得到的输出完全相同,但远程操作不会被触发——这正是我想要的
我只能提出两个可能的原因:请求可能被视为跨域请求,因此被拒绝——不确定这是否可能——或者AJAX请求没有等待CURL请求完成。如果是这样的话,我不确定是否有办法“强迫”它尽可能多地等待
更新:我们已经找到了第三个可能的原因-如果curl请求是通过AJAX请求执行的,那么远程网站可能看不到cookie吗?(这将解释这样一个事实,即尽管通过AJAX调用curl请求本身似乎也能正确执行,但所需的远程操作尚未触发)
如果您有任何想法,我们将不胜感激。打印您的输出
echo $output = curl_exec($c);
或
关于强制ajax调用等待,我已经成功地将ajax操作包装在一个承诺中。这应该可以很容易地检测curl操作是否成功完成,因为如果承诺没有解决,那么“dostuff”操作将永远不会执行。另外还有一个额外的好处,那就是记录每一步的响应,这样您就可以看到curl请求发生了什么 如果您需要在“执行任务”之前解析响应,您还可以将附加的then子句链接到承诺上。包括错误捕获应该有助于深入了解一切是如何工作的 JavaScript:
var promise = new Promise(function(resolve, reject){
$.ajax({
url: 'curl.php',
data: {
someVariable: "someValue"
},
dataType: "json",
success: function(response){
//resolve response, instead of do stuff
console.log(response);
resolve(response);
}
});
});
promise.then(function(response){
//do stuff
console.log(response);
return(response);
});
您是否有任何错误?您的PHP脚本似乎没有对输入变量执行任何操作(AJAX请求的
data
部分根据请求方法填充$\u GET或$\u POST),并且似乎没有实际输出任何内容(您将从curl请求中产生的任何内容分配给$output,但实际上并没有对$output执行任何操作)。@Ostin Nope,nothing.curl_error()为空。奇怪的是,当我通过AJAX执行curl请求时,得到的curl请求输出是相同的(正确)正如我在单独执行PHP脚本时得到的一样。问题是,CURL请求旨在触发远程服务器的某个函数,而在AJAX的情况下,该函数不会被触发。(相应地更新问题)下面是一个很好的答案,但仅供参考,您可以让这个脚本更简单:
也尝试了file\u get\u内容,但也不起作用……我从CURL中得到的输出在这两种情况下都是相同的(正确的)。(抱歉-请查看更新的问题)如果您的输出不是json值,请从ajax数据类型中删除此值:“json”,
我确实要求它是json-为了测试而尝试删除它,但仍然不起作用,尽管输出是什么echo$output=curl\u exec($c);
您得到的是什么?我得到的是一个图像,这确实是我应该得到的,从它按预期工作时的输出判断。
$output = curl_exec($c);
echo json_encode($output);// if array value
var promise = new Promise(function(resolve, reject){
$.ajax({
url: 'curl.php',
data: {
someVariable: "someValue"
},
dataType: "json",
success: function(response){
//resolve response, instead of do stuff
console.log(response);
resolve(response);
}
});
});
promise.then(function(response){
//do stuff
console.log(response);
return(response);
});