2013-06-12 61 views
1

我使用ajax做一個POST請求建立在Zend框架上的API。 API正在返回成功的JSON消息,但AJAX將其讀爲錯誤。Ajax讀取成功,因爲錯誤從zend休息控制器

我已閱讀了大約6篇文章並實施了他們的解決方案。沒有任何幫助。

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

我使用查爾斯驗證響應代碼和內容類型被設置正確。

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

成功函數不會被調用。這總是錯誤功能。我究竟做錯了什麼?

UPDATE

我嘗試過了Chrome瀏覽器,並得到一個XMLHttpRequest不能加載訪問控制允許來源的錯誤消息。經過一番調查後,我發現你不能使用AJAX訪問不同域的URL。我在與通過curl調用API的Javascript相同的域上創建了一個PHP腳本。我已經將我的ajax腳本設置爲使用中間腳本,並且它工作得很好。

我只是改變了URL行的AJAX功能得到它的工作

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

}

+0

這是一個總的猜測,但你試過沒有設定HttpResponseCode? –

+0

我沒有。試過了。沒有喜樂,但謝謝。 – liz

回答

2

我認爲你必須添加dataType:'jsonp'參數爲$就功能。閱讀關於dataType的更多信息

此外,Zend有Zend_Controller_Action_Helper_Json,它將刪除佈局併發送正確的Content-Type

例子:

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

也試過了。沒有工作。 – liz

+0

@liz,因爲您正在向其他域請求,請嘗試使用:dataType:'jsonp' –

+0

這很有效!謝謝。我可能會保留PHP腳本作爲中間人,但很高興有一個解決方案。 – liz