2014-12-22 106 views
-3

有人可以提供关于$ http如何处理JSON的背景知识吗?它是否检测输出的格式并在成功时自动将其转换为JSON,还是我必须手动处理?

如果这是默认行为,如果它无法将输出转换为JSON会发生什么?

语境:在这种情况下我的web服务失败,因为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 
生成

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

学习中的错误

PHP行: 成功获取任何2xx状态代码运行,而错误的任何1XX,3XX运行,4XX & 5XX

+0

服务器在响应请求时是否设置了“Content-Type”标头?如果不是,那么你必须告诉'$ http'什么期望。 – Brett

+0

Web服务返回什么状态代码? –

+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本身我得到最新的输出。这个。$ http.get(common.Config.getEndPoint()+“/ sync”,{params:params,cache:false})' – user2727195

+0

第二个问题真的属于它自己的问题,以帮助未来的读者。如果你决定制作一个,请将我与问题联系起来,我会检查一下。 –

+0

我想,但我恐怕有些白痴在这里太急于投票,然后在讨论后我才真正有机会提出问题,有时在某些领域,我不清楚需要问什么,有什么建议? – user2727195