Ajax читает успех как ошибку Zend Rest контроллера
Я использую ajax для выполнения запроса POST к API, построенному на Zend Framework. API возвращает успешное сообщение JSON, но AJAX читает его как ошибку.
Я прочитал около полудюжины постов и внедрил их решения. Ничего не помогает.
Мой Zend Controller из 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);
}
});
Функция успеха никогда не вызывается. Это всегда функция ошибок. Что я делаю неправильно?
ОБНОВИТЬ
Я попробовал это в Chrome и получил xmlhttprequest не может загрузить сообщение об ошибке access-control-allow-origin. После некоторого расследования я обнаружил, что вы не можете использовать AJAX для доступа к URL-адресу другого домена. Я создал PHP-скрипт в том же домене, что и Javascript, который вызывает API через curl. Я настроил свой ajax-скрипт на использование промежуточного сценария, и он работает просто отлично.
Я просто изменил строку url в функции ajax, чтобы она работала
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);
}
1 ответ
Я думаю, что вы должны добавить 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));
}