2012-03-02 4 views
0

Я настроил REST для моего CakePHP, и у меня небольшая проблема. При вызове метода GET, такого как просмотр или индекс на моем контроллере, или даже настраиваемый метод GET, у меня нет проблем с получением ответа. Но когда я пытаюсь выполнить POST-действие, например add, я не получаю никакого вывода из операции, хотя я вижу, что он правильно его выполнил и выполнил (сохранен в БД).CakePHP - POST вызов API REST, возвращающий нуль

Я правильно настроил файл макета для вывода JSON и XML, а также маршрутизацию и представление для каждого типа вывода.

EDIT:

Соответствующий код в beforeFilter в AppController:

 if ($this->RequestHandler->isAjax()) { 
     $this->layout = 'ajax'; 
     $this->autoRender = false; 
     } elseif ($this->RequestHandler->isXml()) { 
     $this->layout = 'default'; 
     $this->RequestHandler->respondAs('xml'); 
     $this->RequestHandler->renderAs($this, 'xml'); 
     } elseif ($this->RequestHandler->ext == 'json') { 
     $this->layout = 'default'; 
     $this->RequestHandler->respondAs('json'); 
     $this->RequestHandler->renderAs($this, 'json'); 
     } elseif ($this->RequestHandler->accepts('html')) { 
     $this->layout = 'frontend'; 
     } 

кодекса Маршруты:

Router::mapResources('fonykers'); 
Router::mapResources('voicenotes'); 
Router::parseExtensions(); 

Соответствующий код в моем add метода в FonykersController:

$response = array('ok' => true, 'title' => 'Thank you for registering', 'msg' => 'A confirmation email has been sent to the provided email address, please click on the link in the email to complete the registration process'); 
if ($this->RequestHandler->isXml()) { 
    $this->set(compact('response')); 
} else if ($this->RequestHandler->ext == 'json') { 
    pr('This prints'); 
    $this->set(compact('response')); //View not being outputted 
    pr('This also prints'); 
} else { 
    echo json_encode($response); 
} 

Мой взгляд в /views/fonykers/json

<?php echo json_encode(array('response' => $response)); ?> 

Моего файл макет для JSON:

<?php 
header("Pragma: no-cache"); 
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate"); 
header('Content-Type: application/json'); 
header("X-JSON: ".$content_for_layout); 
echo $content_for_layout; 
?> 
+0

Невозможно ничего сказать, не видя соответствующего кода. – JJJ

+0

Обновленный вопрос с соответствующим кодом – 8vius

ответ

2

У вас есть несколько вещей происходят ...

Вашего beforeFilter проверяет isAjax, а затем использует elseif для тестирования XML или JSON. Если ваш запрос - AJAX, он никогда не попадет на тесты XML/JSON. Ваш макет, вероятно, не будет установлен вообще, что оставит вас только с $this->autoRender = false;.

Поскольку autoRender отключен, в какой-то момент вам придется вручную вызывать рендеринг. Использование $this->set() просто подготавливает переменные для использования в вашем представлении - оно фактически не выводит представление. В действии вашего контроллера единственная строка, которая на самом деле выводит что-либо, - echo json_encode($response);.

Используйте $this->render(), чтобы заставить Cake отображать представление, когда вы этого хотите. Более подробную информацию в The 1.3 Book: Rendering a specific view


Как и в сторону, иногда вы используете ...}elseif(... и иногда вы используете ...}else if(.... Это не технически неправильно, но, будучи последовательным, ваш код будет легче читать.

+0

Спасибо, Farray, я попробую и дам вам знать. Я ранее проверял, что вы сказали о том, что autoRender является ложным, и в этом случае это не происходит, вызовы моего API сделаны из iOS-устройства atm, а правильное расположение и состояние отображения установлены, это не касается части AJAX, потому что это не вызов AJAX. Поэтому, видя, что до сих пор не объяснено, почему это не дает представление. – 8vius

+0

Хорошо, этот рендер работал, видя, что я сказал раньше, есть ли другая причина, почему это не рендеринг? Мой другой API вызывает рендеринг, и они сделаны таким же образом, как и этот. – 8vius

+0

@ 8vius Извините, я неправильно понял эту часть вашего вопроса и подумал, что он не работает с методами AJAX. Позаботимся об этом позже. – Farray

Смежные вопросы