J'ai une demande $ .ajax () avec le type de données défini sur "json". Le serveur renvoie JSON avec le type mime correct "application/json". Et pourtant, le responseText de mon objet jqXHR est toujours une chaîne. Qu'est-ce que je fais mal? Est-ce ainsi que c'est censé fonctionner?
Voici comment je fais l'appel:
var options = {
dataType:'json',
type: 'GET',
url: "http://example.com/api/"
};
var key = "PassToCallback";
var jqXHRObject = $.ajax(options).then(
function(data, textStatus, jqXHR, key) {
this.success(data, textStatus, jqXHR, key);
},
function(jqXHR, textStatus, errorThrown) {
this.error(jqXHR, textStatus, errorThrown);
}
);
console.log(jqXHRObject.getResponseHeader("content-type")); // application/json
console.log(typeof jqXHRObject.responseText); // string
Donc, je dois faire une $.parseJSON(jqXHRObject.responseText)
pour obtenir un objet réel. Cela semble inutile car $ .ajax () devrait convertir automatiquement responseText en fonction de la documentation. Merci!
J'ai eu le même problème. Je retourne une chaîne car elle a été formulée à partir d'une exception. Par exemple. J'utilise un écouteur de noyau avec une sérialisation JSON sur mon projet Symfony2. Ce qui est correct pour les en-têtes appropriés REST.
Quoi qu'il en soit, il suffit de l'analyser; cela fonctionne pour moi:
$.ajaxSetup({
"error": function(jqXHR, status, thrownError) {
alert('error');
var responseText = jQuery.parseJSON(jqXHR.responseText);
console.log(responseText);
}
});
Essayer
$.ajaxSetup({
"error": function(jqXHR, status, thrownError) {
alert('error');
console.log(jqXHR.responseJSON);
}
});
Vous utilisez $ .ajax d'une manière que les documents ne décrivent pas. Utiliser json
comme type de données signifie simplement que les données transmises au rappel success
seront analysées. Utilisez-le comme ceci:
$.ajax({
dataType:'json',
type: 'GET',
url: "http://example.com/api/"
success: function(data, textStatus, jqXHR) {
// `data` contains parsed JSON
},
error: function(jqXHR, textStatus, errorThrown) {
// Handle any errors
}
});
Je ne vois rien dans la documentation qui suggère que responseText serait autre chose que ce que son nom implique: text.
Pourquoi ne pas simplement utiliser .getJSON ? Cela éliminerait la moitié du code que vous avez écrit et convertirait la réponse en JSON. Gagner/Gagner.
Étape 1: Stringify le jqXHR
var errorString = JSON.stringify(jqXHR.responseText);
Étape 2: changez cette chaîne en objet Jquery
var $errorObj = $(errorString);
Étape 3: Trouvez et obtenez quelle partie de responseText vous voulez.
var errorMessage = $errorObj.find('p').eq(1).text();
/* Here Im finding `Message:` thrown by the server, which is inside <p> tag */
C'est tout.
$.ajax( /* ... */ ).fail( function(jqXHR, textStatus, errorThrown) {
var errorString = JSON.stringify(jqXHR.responseText);
var $errorObj = $(errorString);
var errorMessage = $errorObj.find('p').eq(1).text();
alert(errorMessage);
} );