change - Los datos se insertaron correctamente, pero jquery sigue devolviendo un error
edit meta tag javascript (6)
Debe enviar {dataType: ''text''} para que la función de éxito funcione con jQuery y las respuestas vacías.
Utilicé los siguientes jQuery para insertar datos a través del servicio de datos. A pesar de que obtuve el estado de respuesta 201 y los datos se insertaron correctamente en mi base de datos, ¿el sistema todavía lo considera un error y me da una alerta de "error"?
¿Que me estoy perdiendo aqui?
$.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");
}
});
ACTUALIZAR:
Mensaje de depuración de Fire 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"
Esto sucede no porque un 201 sin contenido se considere necesariamente inválido, sino porque el análisis de la cadena vacía ("") es un error de análisis JSON.
Este comportamiento se puede cambiar globalmente o por solicitud configurando un filtro de datos.
$.ajaxSetup({
dataFilter: function(data, dataType) {
if (dataType == ''json'' && data == '''') {
return null;
} else {
return data;
}
}
});
He respondido esto en otro hilo similar :
Tuve el mismo problema y una cosa que lo resolvió para mí fue dejar el "dataType" sin configurar. Al hacer esto, jQuery intentará adivinar el tipo de datos que el servidor está devolviendo y no generará un error cuando su servidor devuelva un 201 sin contenido.
Me había pasado esto antes. Mi problema no incluía una extensión ''.json'' al final de mi cadena de consulta, así que estaba recuperando XML. jQuery se atragantó al intentar analizar el xml como json, lo que provocó que se llamara al controlador de errores.
Yo uso jQuery_2.1.1 y tuve un problema similar PUT fue al controlador error (). Mi principal llamada de REST es
- PONER a la ruta de la clave con nombre (/ rest / properties / mykey1): 204 = Objeto existente actualizado, 201 = Nuevo objeto creado y regresar Encabezado de la ubicación, XXX = cualquier otra cosa más como un error
- POST a ruta de clave desconocida (/ rest / properties): 201 = Nuevo objeto creado y retorno Encabezado de ubicación, XXX = cualquier otra cosa más como un error
El estado 204 de HTTP es NoContent, por lo que jQuery estaba bien con eso, pero 201 = Created estaba esperando el objeto del cuerpo json, pero devolví una parte del cuerpo de longitud cero. La dirección del recurso se dio en un encabezado de respuesta de ubicación.
Puedo devolver el objeto json dependiendo de algunos casos de esquina, así que tuve que usar el tipo de datos: atributo "json". Mi solución jQuery fue error (). Verifique el estado 201 y la función de llamada exitosa ().
$.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 );
}
});
Solución:
aunque todavía no puedo entender cómo obtengo errores de un código anterior, obtuve esta solución alternativa que funciona para mí. (por ahora).
Me encantaría escuchar más ideas.
gracias a todos
$.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);
// }
});