2010-03-22 3 views
21

Ich möchte eine Ajax Anfrage mit Antwort in JSON machen. Also habe ich diese Anfrage Ajax:Wie ruft man eine Funktion auf 404 in JSON Ajax Anfrage mit jQuery zurück?

$.ajax({ 
    url: 'http://my_url', 
    dataType: "json", 
    success: function(data){ 
     alert('success'); 
    }, 
    error: function(data){ 
     alert('error'); 
    }, 
    complete: function(data) { 
     alert('complete') 
    }}) 

Dieser Code funktioniert gut, aber wenn mein url mir einen HTTP-Code 404 senden, werden keine Rückrufe verwendet, auch den vollständigen Rückruf. Nach der Forschung ist es, weil mein dataType 'json' ist, so 404 Rückkehr ist HTML und die JSON-Analyse fehlgeschlagen. Also kein Rückruf.

Haben Sie eine Lösung, um eine Callback-Funktion aufzurufen, wenn ein 404 ausgelöst wird?

BEARBEITEN: Kompletter Rückruf nicht anrufen ist Rückkehr ist 404. Wenn Sie eine URL mit 404 möchten, können Sie anrufen: http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697 es ist mit dieser URL Ich habe mein Problem.

Antwort

19
$.ajax({ 
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697', 
    dataType: "json", 
    success: function(data) { 
     alert('success'); 
    }, 
    error: function(data) { 
     alert('error'); 
    }, 
    complete: function(xhr, data) { 
     if (xhr.status != 0) 
      alert('success'); 
     else 
      alert('fail'); 
    } 
}) 
+4

meinen Sie nicht: "complete: function (Status, Text) {" –

+0

1 Ja, danke! –

+1

Ich versuche auch, aber komplette Rückruf es ist nicht Anruf auch :( Ich aktualisiere meine Frage mit dieser Lösung und erklären mehr – shingara

1

Ist es einfach, weil dataType auf "json" eingestellt ist? Wenn ja, versuchen Sie es zu text ändern und bewerten sich die JSON:

$.ajax({ 
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697', 
    dataType: 'text', 
    success: function(data, status, xmlHttp) { 
     try { 
      data = eval('(' + data + ')'); 
      alert('success'); 
     } catch (e) { 
      alert('json parse error'); 
     } 
    }, 
    error: function(xmlHttp, status, error) { 
     alert('error'); 
    }, 
    complete: function(xmlHttp, status) { 
     alert('complete'); 
    } 
}); 
+0

Das ist gescheitert, auch wenn es funktioniert wie auf URL http://twitter.com/status/user_timeline/shingara.json?count=3&callback=jsonp1269278524295&_=1269278536697 – shingara

+0

Was ist, wenn Sie es ohne die 'Callback = Jsonp ...' in der versuchen URL? Zum Beispiel: http://twitter.com/status/user_timeline/shingara.json?count=3&_=1269278536697 –

9

Mit Ihrer Konfiguration jsonp jQuery verwendet die Daten zu transportieren. Dies funktioniert, indem ein Skriptelement dynamisch eingefügt und die URL auf den angegebenen Wert gesetzt wird. Die vom Server zurückgegebenen Daten werden dann als JavaScript ausgewertet - normalerweise wird der bereitgestellte Rückruf aufgerufen. Wenn der Server einen 404 zurückgibt, ist der Inhalt offensichtlich kein JavaScript und der Rückruf wird nie aufgerufen. Einige Browser unterstützen Fehlerhandler auf dem Skript-Tag, die in diesen Situationen aufgerufen werden. Leider unterstützt IE das nicht. Der beste Weg, einen Fehler zu erkennen, ist, sich auf ein Timeout zu verlassen.

In Ihrem Fall sollten Sie eine zusätzliche timeout Option angeben, die den Aufruf des Fehlerhandlers verursacht, wenn der Callback nicht rechtzeitig aufgerufen wurde (was bei einer 404-Antwort der Fall wäre).

$.ajax({ 
    url: 'http://my_url', 
    timeout: 2000, // 2 seconds timeout 
    dataType: "json", 
    success: function(data){ 
    alert('success'); 
    }, 
    error: function(data){ 
    alert('error'); 
    }, 
    complete: function(data) { 
    alert('complete') 
    } 
}); 
+0

Die Zeitüberschreitung Lösung nicht gelöst. Call nothing after pass :( – shingara

+0

Das gleiche hier, meins löst nur den Fehler jedes Mal, obwohl es die Daten bekommt. –

+0

Nicht sicher, was diese Antwort den ganzen Weg hier unten auf -1 tut. –

2

Glauben Sie nicht, dass das Problem nicht mit dem Datentyp ist aber mit Cross-Domain-Anfragen, die es nicht erlaubt zu machen?

Der folgende Code funktioniert wie erwartet, wenn Sie Daten aus der gleichen Domäne anfordern und nicht der Fall ist, wenn Sie Cross-Domain-Anfragen machen:

function handle404(xhr){ 
    alert('404 not found'); 
} 

function handleError(xhr, status, exc) { 
    // 0 for cross-domain requests in FF and security exception in IE 
    alert(xhr.status); 
    switch (xhr.status) { 
     case 404: 
      handle404(xhr); 
      break; 
    } 
} 

function dumbRequest() { 
    var url = 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697'; 
    url = 'http://twitter.com/';  
    url = '/mydata.json';  
// url = 'mydata.json';  
    $.ajax(
     {url: url, 
     dataType: 'json', 
     error: handleError} 
    ); 
} 
+0

Das Problem ist ein Fehler nie aufrufen. Kein domänenübergreifendes Problem :( – shingara

1

Ist Ihnen bewusst, dass, obwohl die HTTP-Status 404, die Ist Körper JSON? Zum Beispiel hat this link die folgende JSON:

jsonp1269278524295({"request":"/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697","error":"Not found"})

Als solche sollten Sie überprüfen, ob Ihre Daten, um die error Eigenschaft innerhalb Ihrer normalen Callback-Funktion haben.

UPDATE: Es scheint, obwohl der eigentliche Inhalt der Seite gültig JSON ist, wird der Browser (Ich habe in Firefox) ausführt es nicht, wahrscheinlich, weil es ein 404. ist Da hat jQuery eine script hinzufügen (aufgrund des domänenübergreifenden Problems) wird der JSONP-Wrapper nie aufgerufen, und folglich auch keine Callbacks.

Also, kurz gesagt, ich glaube nicht, dass es eine Möglichkeit gibt, damit umzugehen, ohne dieses Skriptelement manuell hinzuzufügen und zu überprüfen, ob Ihre vordefinierte Callback-Funktion danach aufgerufen wurde.

0

So gehe ich damit um. Ich überprüfe die zurückgegebenen Daten auf Fehler, bevor ich versuche, sie zu verwenden. Was unten gezeigt wird, ist nur ein Beispiel, das Sie erweitern könnten, um Ihren Anforderungen besser zu entsprechen. Dies ist auch der Auffassung outs Sitzungszeit und andere Szenarien ...

Mein erster Anruf:

$.ajax({ type: 'POST', 
    url: '../doSomething', 
    data: 'my data', 
    success: function(data) { 
     if (HasErrors(data)) return; 
     var info = eval('(' + data + ')'); 
     // do what you want with the info object 
    }, 
    error: function(xmlHttpRequest) { 
     ReportFailure(xmlHttpRequest); 
    } 
    }); 

Und die beiden Hilfsfunktionen:

function HasErrors(data) { 
    if (data.search(/login\.aspx/i) != -1) { 
    // timed out and being redirected to login page! 
    top.location.href = '../login.aspx'; 
    return true; 
    } 
    if (data.search(/Internal Server Error/) != -1) { 
    ShowStatusFailed('Server Error.'); 
    return true; 
    } 
    if (data.search(/Error.aspx/) != -1) { 
    // being redirected to site error reporting page... 
    ShowStatusFailed('Server Error. Please try again.'); 
    return true; 
    } 
    return false; 
} 

und

function ReportFailure(msg) { 
    var text; 
    if (typeof msg == 'string') { 
    text = msg; 
    } 
    else if (typeof msg.statusText == 'string') { 
    if (msg.status == 200) { 
     text = msg.responseText; 
    } 
    else { 
     text = '(' + msg.status + ') ' + msg.statusText + ': '; 
     // use the Title from the error response if possible 
     var matches = msg.responseText.match(/\<title\>(.*?)\<\/title\>/i); 
     if (matches != null) 
     { text = text + matches[1]; } 
     else 
     { text = text + msg.responseText; } 
    } 
    } 
    // do something in your page to show the "text" error message 
    $('#statusDisplay') 
    .html('<span class="ui-icon ui-icon-alert"></span>' + text) 
    .addClass('StatusError'); 
} 
1

gerade konfrontiert das gleiche Problem, und sah another question erwähnt, dass jQuery-JSONP (jQuery Plugin) Catchin unterstützt g 404 Fehler oder wie sie beschreiben: „Fehlerwiederherstellung im Falle eines Netzausfalls oder schlecht gebildet JSON Antworten“

Und es funktioniert perfekt :)

Hier ist meine (vereinfacht) Code für Details Abrufen über ein YouTube-Video über JSONP:

$.jsonp(
{ 
    url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA", 
    callbackParameter: "callback", 
    data: 
    { 
     alt: "jsonc-in-script", 
     v: "2" 
    }, 
    success: function(json, textStatus) 
    { 
     console.log("WEEEEEEEE!"); 
    }, 
    error: function(xOptions, textStatus) 
    { 
     console.error(arguments); 
    } 
}); 
+0

Dies ist eine großartige Lösung für die eigentliche Frage. Es ist eine Schande, dass die Bibliothek nicht mehr entwickelt zu werden scheint. Gibt es eine ähnliche Lösung für moderne Versionen von jQuery? –

0

folgende Lösung funktioniert gut für mich :)

$.ajax({ 
    url: 'http://my_url', 
    dataType: "json", 
    success: function(data){ 
     alert('success'); 
    }, 
    error: function(data){ 
     alert('error'); 
    },complete: function(xhr, data) { 
     if(data==="parsererror"){ 
      alert('404'); 
     } 
    } 
}); 
4

Wenn Sie Wenn Sie beim Zugriff auf die Twitter-API mit JavaScript und jsonp auf Fehler reagieren möchten, müssen Sie in Ihrer Anfrage den Parameter suppress_response_codes angeben. Dies bewirkt, dass alle Antworten von der Twitter-API mit einer Antwort 200 OK antworten und einen Fehler enthalten. Dann müssen Sie prüfen, ob die Antwort den Parameter error enthält oder nicht.

$.ajax({ 
    url: "https://api.twitter.com/1/users/show.json", 
    dataType: 'jsonp', 
    jsonp: "callback", 
    data: { 
    screen_name: "simongate1337", 
    suppress_response_codes: true // <- Important part 
    }, 
    success: function(data) { 
    if(data.error) { 
     console.log("ERROR: "+data.error); 
    } else { 
     console.log("Success, got user " + data.screen_name); 
    } 
    } 
}); 
3

Verwenden Sie die statusCode -Wahl

$.ajax({ 
    url: 'http://my_url', 
    dataType: "json", 
    statusCode: { 
     404:function(){ 
      alert("I could not find the informations you requested."); 
     } 
    } 
    success: function(data){ 
     alert('success'); 
    }, 
    error: function(data){ 
     alert('error'); 
    }, 
    complete: function(data) { 
     alert('complete') 
    }})