Ajax从zend rest控制器读取成功作为错误



我使用ajax对构建在Zend框架上的API进行POST请求。API返回一个成功的JSON消息,但是AJAX将其读取为错误。

我已经阅读了大约六篇文章,并实施了他们的解决方案。什么都没用。

My Zend Controller from 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来验证Response代码和内容类型是否设置正确。

这是我的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);
    }
});

success函数永远不会被调用。它总是误差函数。我做错了什么?

更新

我在Chrome中尝试了一下,得到了xmlhttprequest不能加载access-control-allow-origin错误消息。经过一番调查,我发现不能使用AJAX访问不同域上的URL。我在与Javascript相同的域上创建了一个PHP脚本,该脚本通过curl调用API。我已经设置了我的ajax脚本使用中间脚本,它工作得很好。

我只是改变了ajax函数中的url行,使其工作

url: 'localscript.php',

这是localscript.php文件,它正在调用Zend Rest API,以防有人发现它有用。

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); 

}

我认为您必须为$添加dataType:'jsonp'参数。ajax功能。阅读更多关于dataType

的信息

此外,Zend有Zend_Controller_Action_Helper_Json,它删除布局并发送正确的Content-Type

的例子:

public function deleteAction()
{
        $this->_helper->json(array(
            'msg'     => 'Lead has been deleted.',
            'success' => true));
}

最新更新