2010-02-10 10 views
17

Ho usato jQuery seguente per inserire dati tramite il servizio dati. Evento sebbene abbia ricevuto la risposta di stato 201 e i dati siano stati inseriti correttamente nel mio database, il sistema lo considera ancora come un errore e mi dà un avviso "non riuscito"?Dati inseriti correttamente ma jquery restituisce ancora l'errore

Cosa mi manca qui?

$.ajax({ 
    type: "POST", 
    url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/", 
    data: JSON.stringify(record), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function() { 
     alert("Success"); 
    }, 
    error: function(xhr) { 
     alert("fail"); 
    } 
}); 

UPDATE:

Debug Messaggio del Fuoco Bug:

Preferences 

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

jquery....min.js (line 127) 
POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

201 Created 6.7s 

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/ 

201 Created 


get readyState 4 

get responseText "{ "d" : {\r\n"__metadata"...\')/XMLForm"\r\n}\r\n}\r\n} }" 

get responseXML null 

get status 201 

get statusText "Created" 
+1

Provare a utilizzare Firebug per visualizzare la risposta http dal server. Questo potrebbe dirti perché sta fallendo. – tbreffni

+0

Potresti, per favore, darmi dei consigli su dove cercare sono nuovo a consumare ADO.Net in Ajax. Ho usato firebugs ma non ho trovato alcun errore lì. Ho aggiornato il registro da FireBug –

+0

Strano. Per quanto posso vedere, '201' è considerato un successo in JQuery. –

risposta

57

È necessario inviare {dataType: 'testo'} per far funzionare correttamente la funzione di successo con jQuery e le risposte vuote.

+2

Grazie - ho avuto dataType: "json" ed ero sconcertato da questo. –

+0

Ha funzionato anche per me. Ho trascorso giorni su questo! Mi chiedo perché sia ​​così. – sshirley

+7

Se si guarda alla fonte https://github.com/jquery/jquery/blob/master/src/ajax.js#L706 - jquery sta controllando per vedere se lo stato è prima 204, quindi se è 304, altrimenti prova a utilizzare il risultato dell'esecuzione della risposta tramite un convertitore ... Il convertitore JSON genera un'eccezione apparentemente su una stringa vuota/nessun contenuto che restituisce un errore anche se lo stato è positivo. Supponendo che con il convertitore di testo, jQuery non abbia problemi nell'analisi di un corpo di risposta vuoto. Sembra una stupida hack - e probabilmente jQuery non agisce come previsto in questo scenario –

8

Soluzione:

anche se io continuo a non capire come io l'errore dal codice precedente ottenere , Ho questa soluzione alternativa che funziona per me. (almeno per ora).

piacerebbe sentire più idee

ringraziare tutti voi

$.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/", 
      data: JSON.stringify(record), 
      complete: function(xhr) { 
       if (xhr.readyState == 4) { 
        if (xhr.status == 201) { 
         alert("Created"); 
        } 
       } else { 
        alert("NoGood"); 
       } 
      } 
      //     
      //    success: function(data) { 
      //     alert("Success"); 
      //    }, 
      //    error: function(xhr) { 
      //     alert("fail" + xhr); 
      //    } 
     }); 
+0

Ho anche avuto lo stesso problema .... Si è rivelato essere quello che "YourParadigm" ha detto sotto .... – postalservice14

+0

Ho esattamente lo stesso problema. La cosa strana è che stava lavorando per un po '. Quindi è stata aggiunta un'intestazione personalizzata alle chiamate di servizio e da allora non sono riuscito a utilizzare l'attributo "successo". Ora il vero trucco è passare una funzione personalizzata per un successo e non dover eseguire il controllo xhr.readystate in ogni funzione. – Chris

+0

Questa non dovrebbe essere la risposta accettata in quanto questa soluzione sta praticamente aggirando il messaggio di errore passandolo manualmente. IMO, la risposta accettata dovrebbe essere quella di Ruben Stolk. – leojh

2

Ho avuto questo accada a me in precedenza. Il mio problema non includeva l'estensione ".json" alla fine della mia stringa di query, quindi ricevo il codice XML. jQuery si è soffocato nel tentativo di analizzare l'xml come json, causando il richiamo del gestore degli errori.

+0

Ho una stringa di query simile a questa: '/ self-service/api/v1/user /' - l'aggiunta di '? Format = json' alla fine non funziona, anche se questo renderà il servizio web api return json piuttosto di xml. – henrikstroem

2

Io uso jQuery_2.1.1 e ho riscontrato un problema analogo al gestore di errore(). Il mio riposo chiamata API principale è

  • PUT per nome percorso della chiave (/ resto/proprietà/mykey1): 204 = Aggiornamento oggetto, 201 = Creato nuovo oggetto in corso e ritornare Località intestazione, XXX = qualsiasi altra cosa più simile a un errore
  • POST per sconosciuto percorso della chiave (/ riposo/proprietà): 201 = Creato nuovo oggetto e tornare intestazione Location, XXX = qualsiasi altra cosa più simile a un errore

Http stato 204 è nocontent così jQuery andava bene con esso , ma 201 = Creato si aspettava oggetto corpo JSON ma ho restituito la parte del corpo a lunghezza zero. L'indirizzo di risorsa è stato fornito in un'intestazione di risposta di posizione.

Posso restituire l'oggetto json a seconda di alcuni casi d'angolo, quindi ho dovuto usare il tipo di dati: attributo "json". La mia soluzione jQuery era error() per verificare lo stato 201 e chiamare la funzione success().

$.ajax({ 
    url: "/myapp/rest/properties/mykey1", 
    data: jsonObj, 
    type: "PUT", 
    headers: { "Accept":"application/json", "Content-Type":"application/json" }, 
    timeout: 30000, 
    dataType: "json", 
    success: function(data, textStatus, xhr) { 
     data="Server returned " + xhr.status; 
     if (xhr.status==201) data+=" "+xhr.getResponseHeader("location"); 
     $("#ajaxreply").text(data); 
    }, 
    error: function(xhr, textStatus, ex) { 
     if (xhr.status==201) { this.success(null, "Created", xhr); return; } 
     $("#ajaxreply").text(textStatus + "," + ex + "," + xhr.responseText); 
    } 
});  
2

ho risposto a questo su altri similar thread:

Ho avuto lo stesso problema e una cosa che ha risolto per me stava lasciando la "dataType" unsetted. Quando si esegue questa operazione, jQuery tenterà di indovinare il tipo di dati restituito dal server e non genererà un errore quando il server restituisce un 201 senza contenuto.

4

Ciò accade non perché un 201 senza contenuto è necessariamente considerato non valido ma poiché l'analisi della stringa vuota ("") è un errore di analisi JSON.

Questo comportamento può essere modificato a livello globale o per richiesta impostando un filtro dati.

$.ajaxSetup({ 
    dataFilter: function(data, dataType) { 
     if (dataType == 'json' && data == '') { 
      return null; 
     } else { 
      return data; 
     } 
    } 
}); 
Problemi correlati