Comment faire de jQuery analyser ma réponse d'erreur représenté comme un json valide?
Voici mon code:
$.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 demande:
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":...
Le corps de la requête est en fait un json valide, je viens tronquée pour des raisons de concision.
La réponse:
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": [
{...
Encore une fois, la réponse est tout à fait valable, json, tronqué pour des raisons de concision.
Comme prévu, le error
gestionnaire est appelé avec le err
objet. Cependant, comment puis-je mettre la main sur l'analyse json? Bien sûr, j'ai pu vérifier que le type de contenu de la réponse json et ensuite d'analyser le err.responseText
moi-même, mais n'est-ce pas ce que l'ajax de jQuery est censé faire pour moi? Je veux dire, il le fait pour mon $.get
requêtes lorsque je reçois les objets du serveur.
Ce qui me manque?
MODIFIER
C'est une correction de https://stackoverflow.com/a/12310751/80002:
Faire la demande:
var ajax = $.ajax(...
De traitement de la réponse d'erreur:
var res, ct = ajax.getResponseHeader("content-type") || '';
if (ct.indexOf('json') > -1) {
res = $.parseJSON(err.responseText);
//process the response here
}
Vous devez vous connecter pour publier un commentaire.
Pour un message d'erreur avec un non-2001 Le code d'état HTTP, le contenu ne sera pas analysé par jQuery. Si vous voulez vraiment de ne pas analyser le résultat JSON vous-même, vous devez retourner un code d'état HTTP 200 et utiliser le
success
(done
) rappels.C'est un bon signe que vous utilisez (votre exemple) HTTP code 409, et je pense que vous devriez continuer à le faire - il suffit de mordre la balle et parser le JSON manuellement dans votre gestionnaire d'erreur. Si le traitement échoue, quelque chose a mal tourné (comme un réseau temporaire à l'échec), mais cela vous permettra de construire une belle API que vous (et probablement d'autres) peut consommer sans avoir à créer trop de contrôle d'erreur dans la réussite de la fonction.
Garder
success
pour les heureux résultats, eterror
pour les malheureux résultats.1 Techniquement tout 2xx de la situation, doit être considéré comme une réussite; en jQuery
(état >= 200 && état < 300 || statut === 304)
compte que quelque chose réussie.J'ai rencontré le même problème et a trouvé une manière légèrement différente de @Barmar de réponse.
Aswell comme
responseText
, il y a aussi unresponseJSON
de la propriété, de sorte que vous pouvez faire ce qui suit:Si vous
console.log(err);
il y a quelques propriétés de là que vous pouvez les utiliser dans votre message d'erreur sur la page.responseJSON
pour un échec de l'intervention. il l'a fait pour google chrome sur mac, mais n'a pas pour google chrome sur windows, ni safari sur iOS.err
est ce cas est le jqXHR objet etresponseJSON
peut-être pas définie si le texte de la réponse n'a pas pu être analysé, de sortejson_response = err.responseJSON ? err.responseJSON.msg : "some error happened";
peut-être mieux.Appel
$.parseJSON
explicitement dans votre erreur rappel: