我很难理解为什么当通过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); // return the result instead of outputting it
$output = curl_exec($c);
curl_close($c);
?>
我们通过JQuery调用它:
$.ajax({
url: 'curl.php',
data: {
someVariable: "someValue"
},
dataType: "json",
success: function(response){
//do stuff
}
});
CURL请求应该在远程服务器上触发某个操作(在这种情况下,它调用cgi脚本,在某些远程数据库中插入记录)。
更新:为了执行远程cgi脚本,必须从远程网站将cookie设置到我的浏览器。(确实如此 - 设置了所述cookie)
如果我单独运行curl.php脚本,其中的CURL请求将完美运行(触发远程操作)。但是,如果我通过AJAX异步调用它,虽然我从它获得的输出与我单独执行curl.php脚本时获得的输出完全相同,但是不会触发远程操作 - 这就是我的意思我以后。
我只能提出两个可能的原因:请求可能被视为跨域请求,因此被拒绝 - 不确定是否可能 - 或者AJAX请求不等待CURL请求完成。如果是这种情况,我不确定是否有办法“强迫”它等待所需的数量。
更新:已经提出了第三个可能的原因 - 如果通过AJAX请求执行curl请求,远程网站会不会显示所述cookie?(这可以解释事实上,虽然curl请求本身似乎也可以通过AJAX调用时正确执行,但尚未触发所需的远程操作)
对任何想法都会感激不尽。
答案 0 :(得分:1)
打印输出
echo $output = curl_exec($c);
或
$output = curl_exec($c);
echo json_encode($output);// if array value
答案 1 :(得分:0)
关于强制ajax调用等待,我已成功将ajax操作包装在promise中。这样可以很容易地检测卷曲操作是否成功完成,因为如果承诺没有解决,那么&#34;做东西&#34;操作永远不会执行。在每一步中记录响应的额外好处还有,因此您可以看到curl请求发生了什么。
你还可以将附加的条款链接到承诺上,例如,如果你需要在“做”之前解析响应。&#34;包括错误捕获应该有助于深入了解一切是如何工作的。
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);
});