2014-12-22 2 views
-3

Может ли кто-нибудь дать информацию о том, как работает $ http в отношении JSON, обнаруживает ли он формат вывода и автоматически преобразует его в JSON при успешном выполнении или я должен обрабатывать это вручную?

Если это поведение по умолчанию, что произойдет, если он не сможет преобразовать вывод в JSON?

Контекст: В этом случае, когда мой веб-службы не удалось из-за ошибки соединения SQL, но success еще получил под названием

Мой $ HTTP, связанные кодовая последовательность:

this.$http.defaults.headers.common["Accept"] = "application/json"; 

    this.$http.get(common.Config.getEndPoint() + "/sync", {params:params}) 
     .success(function(data, status, headers, config) { 
      self.onResult(data); 
     }) 
     .error(function(data, status, headers, config){ 
      console.log(data) 
     }); 

Ошибка - (потому что мой MySql сервер не был запущен, это может быть исправлено, но моя цель - грациозно обработать эту ошибку на интерфейсе, если это произойдет, ищет хорошую стратегию как на бэкэнде, так и на внешнем интерфейсе)

SQLSTATE[HY000] [2002] Connection refused<br /> 
<b>Fatal error</b>: Call to a member function prepare() on a non-object in 

PHP строка, которая генерировала ошибку

$statement = $this->connection->prepare("SELECT id, username, password FROM `user` WHERE username = :username AND suspended = 0 AND deleted = 0"); 

обучение: успеха запускаемый для любых кодов статуса 2xx, в то время как ошибка работает для любого 1xx, 3xx, 4xx & 5xx

+0

Определяется ли сервером заголовок 'Content-Type', когда он отвечает на запрос? Если нет, то вам нужно сказать '$ http', чего ожидать. – Brett

+0

Какой код состояния возвращается из веб-службы? –

+0

@NeilSmith. Я отредактировал код, чтобы ответить на ваш вопрос. Дело в том, как изящно справиться с этой ситуацией? – user2727195

ответ

0

Проблема заключается в том что код статуса успеха возвращается без действительных данных JSON. Это связано с тем, что API возвращает неправильный код состояния. Вы должны исправить это в API, если вы хотите на самом деле решить эту проблему:

if db is down 
    return 503 or something. 

В противном случае, вы можете проверить код состояния в вашем успехе обратного вызова:

this.$http.get(common.Config.getEndPoint() + "/sync", {params:params}) 
    .success(function(data, status, headers, config) { 
     if (status starts with 2) 
      self.onResult(data); 
    }) 
    .error(function(data, status, headers, config){ 
     console.log(data) 
    }); 

Но это не правильный исправить imo. Ваш заголовок требует изящного способа обработки ошибок, а второй подход не является изящным.

Также обратите внимание на псевдокод там (я забыл, если статус является строкой или номером).

+0

, можете ли вы, пожалуйста, помочь мне с кешированием, он все еще привязан к старому выходу, добавлен параметр кэша, но не используется, если я изменю params я получаю последний результат. 'this. $ http.get (common.Config.getEndPoint() +"/sync ", {params: params, cache: false})' – user2727195

+0

Второй вопрос действительно принадлежит к собственному вопросу, чтобы помочь будущим читателям. Свяжите меня с вопросом, решите ли вы его сделать, и я проверю его. –

+0

Я бы, но я боюсь, что некоторые идиоты здесь слишком жаждут голоса, прежде чем я на самом деле получаю возможность укрепить вопрос после обсуждения, иногда в определенных областях. Я не понимаю, что нужно просить, какие-либо советы? – user2727195

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