我正在使用 ajax 向基于 Zend 框架的 API 发出 POST 请求。API 正在返回一条成功的 JSON 消息,但 AJAX 将其读取为错误。
我已经阅读了大约六篇文章并实施了他们的解决方案。没有任何帮助。
我的 Zend 控制器来自 API
class LeadController extends Zend_Rest_Controller
{
public function init()
{
$this->_helper->viewRenderer->setNoRender(true);
}
public function postAction()
{
$this->getResponse()
->setHttpResponseCode(201)
->setHeader('Cache-Control','no-cache', true)
->setHeader('Content-Type', 'application/json', TRUE)
->setHeader('charset', 'utf-8', TRUE)
->appendBody(json_encode(array('results' => 'success')));
return;
}
}
我正在使用 Charles 来验证响应代码和内容类型是否设置正确。
这是我已验证的 JSON 响应。
{"results":"success"}
我的 AJAX 代码
$.ajax({
type: 'POST',
url: myurl,
data: inputs,
cache: 'false',
success: function(data){
console.log('success');
},
error: function(xhr, status, thrown){
console.log("Error:");
console.log(status);
}
});
成功函数永远不会被调用。它始终是错误函数。我究竟做错了什么?
更新
我在 Chrome 中试了一下,得到了 xmlhttprequest cannot load access-control-allow-origin 错误消息。经过一番调查,我发现您不能使用 AJAX 访问不同域上的 URL。我在与通过 curl 调用 API 的 Javascript 相同的域上创建了一个 PHP 脚本。我已经将我的 ajax 脚本设置为使用中间脚本,它工作得很好。
我刚刚更改了 ajax 函数中的 url 行以使其正常工作
url: 'localscript.php',
这是调用 Zend Rest API 的 localscript.php 文件,以防有人发现它有用。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
//add fields from POST
foreach($_POST as $key => $value) {
$data[$key] = $value;
}
//url-ify the data for the POST
$fields_string ='';
foreach($data as $key=>$value) {
$fields_string .= $key.'='.urlencode($value).'&';
}
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
//execute post
$result = curl_exec($ch);
$info = curl_getinfo($ch);
$start = stripos($result, "<body");
$end = stripos($result, "</body");
$body = substr($result,$start,$end);
echo $body;
//close connection
curl_close($ch);
}