Ajax JSON всегда возвращает ошибку, хотя формат JSON в ответе является правильным

Я пытался реализовать вход Ajax с CakePHP 1.3. У меня есть всплывающее окно с простым именем пользователя / пароль для входа.

Следующее находится в моих представлениях / elements / login.ctp:

echo $this->Form->create('User', array('url'=>array('controller'=>'users','action'=>'login'), 'id'=>'user_login'));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Login'));

Следующее есть в моем контроллере controllers/users_controller.php

public function ajax_login() {

    $response = array('success'=>false);

      if($this->RequestHandler->isPost()) {
         if($this->Auth->login()) {
            $response = array('success'=>"true");
         } else {
            $response = array('success'=>false);
         }
      }
        $this->set('response', $response);

}

Представление для вышеуказанного контроллера находится под views/users/ajax_login.ctp имеет ТОЛЬКО эту строку:

echo $javascript->object(isset($response) ? $response : array());

Мой Ajax имеет следующий код:

function login_user(){

    var username = $("#UserUsername").val();
    var password = $("#UserPassword").val();

    if(username == "" || username == null || password == "" || password == null){
        alert("Please enter a username and password");
        return false;
    }

    $.ajax({
        url:"/users/ajax_login",
        type:"POST", 
        data:$('#user_login').serialize(), 
        dataType:"json",
        async: true,
    success: function() { console.log("success"); }, 
    error: function(msg) { console.log(msg); }
    });

    return false;
}

Теперь, кажется, все работает отлично, однако, это всегда приводит к обратному вызову "error", и я не знаю почему. Я прочитал все ссылки ниже на stackru, и ни одна из них, похоже, не является проблемой!

Странное поведение JSON при запросе файла json через $.ajax искаженный JSON, в то время как JSON действителен? Результат ошибки Ajax: jts_encode struts2 создает искаженный JSON (с дополнительным скрытым символом) php json_encode, не возвращающий правильную строку в кодировке json

Единственное, что я подозреваю, это когда я читаю console.log(msg) ошибки, я получаю правильный ответ HTML {"success":true} в правильном формате... НО... "responseText" я получаю что-то вроде этого:

responseText: "{" success ": true}"

так что в основном я догадываюсь, что именно это "" приводит к тому, что формат json всегда терпит неудачу в моем вызове ajax. Как же я могу избавиться от этого?!... Я больше не уверен, является ли это проблемой CakePHP, или проблемой AJAX/JSON!... Я работал над обоими более 5 лет, и теперь я застрял!

1 ответ

Решение

Действительно строка <!-- 0.375s --> нарушает ваш код Попытайтесь выяснить, откуда это исходит. Некоторые шаги:

  1. Какой макет вы используете для рендеринга? Пытаться debug($this->layout) в вашем контроллере, чтобы увидеть, что на нем есть. Это вполне может быть там, так как я не вижу, чтобы вы устанавливали макет в ajax например. Торт имеет это ajax макет, который по сути является пустым макетом. Он не должен содержать ничего, кроме echo $content_for_layout; в CakePHP 1.3.
  2. Проверьте и убедитесь, что ваш кодировщик UTF-8 "выплеван". Это необходимо для JSON.
  3. Попробуйте заменить текущий код представления на echo json_encode($response); или сохранить трехстороннюю проверку: echo isset($response) ? json_encode($response) : ''; JavaScriptHelper в любом случае будет то же самое.
  4. Эта "странная строка" вполне может быть комментарием некоего анализатора производительности "время рендеринга". Он приходит откуда-то из вашего приложения, и, как вы можете видеть, это HTML-комментарий. Уменьшите значение отладки в Config/core.php - Я предполагаю, что это 3.

Я предполагаю, что проверка макета и установка его в ajax или же empty решит вашу проблему.

Другие вопросы по тегам