2015-04-23 51 views
0

我试图返回一个402状态码和JSON内容的HTTP响应,它的确定,但是当我尝试读取使用JQuery.parseJSON此响应主体的问题发生(JSON )。jQuery.parseJSON和HTTP状态

$response = new \Zend\Http\Response(); 
$response->setStatusCode(402); 
$response->setContent(json_encode([ 
    "success" => false, 
    "message" => "You need to buy more credits" 
])); 

return $response; 

然后我尝试读取响应内容:

search: function(term, callback){ 
    $.post("/api/v1/client/search", {term: term}).always(function(data){ 
     callback(jQuery.parseJSON(data)); 
    }); 
}, 

而且我得到了以下错误: “未捕获的SyntaxError:意外的标记○”。当我使用200状态码时,一切正常,但是当我将其更改为402时,出现此问题。

我不知道这是否是因为浏览器不传递效应初探身体假定状态代码为响应本身,但这并不改变的事实,服务器已经发送的消息。

有没有办法可以读取它? 我犯了一些错误吗?

谢谢。

+2

使用浏览器的开发者工具,查看返回,也是原始数据,执行console.log(数据),看看在那里实际上是。 – MuppetGrinder

+0

我得到了与JSON.parse(数据)相同的错误,响应内容为:“{”success“:false,”message“:”您需要购买更多的信用“}”。 如果我执行JSON.parse('{“success”:false,“message”:“您需要购买更多的信用”}');在控制台它没问题,只有当我更改状态码时才会发生错误。 – hamboldt

+0

意外的标记表示您的JavaScript在这种情况下无法解析您的数据(并非每次都是这样),因为您在JSON中编码了数据并在此之后再次解析。回调(数据)应该与状态402 – Charly

回答

0

我已经解决了这个问题。我hava检测到,当我在PHP中更改状态标头时,jQuery返回的对象发生了更改。当状态码是200时,jQuery返回一个字符串,当状态码是402时,jQuery返回一个对象,我查找的文本是这个对象的“responseText”属性。

http://i.imgur.com/T7fuInW.png

我的解决办法是:

search: function(term, callback){ 
     $.post("/api/v1/client/search", {term: term}, function(data){ 
      callback(JSON.parse(data)); 
     }) 
     .fail(function(data){ 
      callback(JSON.parse(data.responseText)); 
     }); 
    },