2012-09-07 22 views
18

Aquí está mi código:¿Cómo hacer jQuery analizar mi respuesta de error representada como json válida?

 $.ajax({ 
     url: "/api/invoice/" + newInvoice._id, 
     type: 'PUT', 
     data: JSON.stringify(newInvoice), 
     dataType: 'json', 
     contentType: "application/json; charset=utf-8" 
     }) 
     .success(function() { 
      $('#statusLine').text('Successfully submitted invoice {0}. Click here to dismiss.'.format(newInvoice._id)); 
     }) 
     .error(function (err) { 
      alert(err); 
     }); 

La solicitud:

PUT http://localhost:8000/api/invoice/16211 HTTP/1.1 
Host: localhost:8000 
Connection: keep-alive 
Content-Length: 770 
Origin: http://localhost:8000 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 
Content-Type: application/json; charset=UTF-8 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:8000/invoice.html?id=16211 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"items":[{"id":... 

El cuerpo de la petición es en realidad un JSON válida, acabo de truncado que por razones de brevedad.

La respuesta:

HTTP/1.1 409 Conflict 
X-Powered-By: Express 
Content-Type: application/json; charset=utf-8 
Content-Length: 1386 
ETag: 250542419 
Connection: keep-alive 

{ 
    "msg": "Cannot update the invoice #16211, because it has already been updated by someone else.", 
    "invoice": { 
    "items": [ 
     {... 

Una vez más, la respuesta es una json completamente válido, truncado por razones de brevedad.

Como era de esperar, el controlador error se invoca con el objeto err. Sin embargo, ¿cómo puedo obtener el json analizado? Por supuesto, podría verificar que el tipo de contenido de la respuesta es json y luego analizar el err.responseText, pero ¿no es eso lo que se supone que jQuery ajax debe hacer por mí? Quiero decir, lo hace para mis consultas $.get cuando obtengo los objetos del servidor.

¿Qué me estoy perdiendo?

EDITAR

Esta es una corrección a https://stackoverflow.com/a/12310751/80002:

Hacer la solicitud:

var ajax = $.ajax(... 

Procesamiento de la respuesta de error:

var res, ct = ajax.getResponseHeader("content-type") || ''; 
if (ct.indexOf('json') > -1) { 
    res = $.parseJSON(err.responseText); 
    // process the response here 
} 

Respuesta

26

Para un mensaje de error con un no 200 HTTP status code, el contenido no será analizado por jQuery. Si realmente desea no analizar el resultado devuelto a JSON usted mismo, deberá devolver un estado HTTP 200 y utilizar las devoluciones de llamada success (done).

Es una buena señal de que está usando (de su ejemplo) el código HTTP 409, y creo que debería seguir haciéndolo: solo tome la decisión y analice el JSON manualmente en su controlador de errores. Si falla el análisis, algo más ha salido mal (como una falla temporal de la red), pero esto le permitirá construir una buena API que usted (y posiblemente otros) pueden consumir sin tener que generar demasiadas comprobaciones de errores en la función de éxito.

Mantenga success para los resultados felices, y error para resultados infelices.

Técnicamente cualquier estado 2xx debe considerarse exitoso; in jQuery (status >= 200 && status < 300 || status === 304) counts as something successful.

10

llamada $.parseJSON explícitamente en su respuesta de error:

(...) 
.error(function (err) { 
    var msg = $.parseJSON(err).msg; 
    alert(msg); 
}); 
+1

+1 Me gustaría poder marcar las respuestas de usted y Joel como una respuesta. – mark

28

me encontré con el mismo problema y encontrar una manera ligeramente diferente de la respuesta de @ Barmar.

Aswell como responseText, también hay una propiedad responseJSON, por lo que podría hacer lo siguiente:

var json_response = err.responseJSON.msg; 

Si console.log(err); Hay algunas propiedades de ahí que es posible que desee utilizar en su mensaje de error en el página.

+1

¡Es una propiedad tan útil! :) –

+0

esto es tan inteligente :) –

+0

¡Muy bien! Bonita forma de hacerlo – DaTebe

Cuestiones relacionadas