Pregunta La solicitud Ajax devuelve 200 OK, pero se dispara un evento de error en lugar de éxito


Implementé una solicitud de Ajax en mi sitio web, y estoy llamando al punto final desde una página web. Siempre regresa 200 OK, pero jQuery ejecuta el evento de error. Intenté muchas cosas, pero no pude resolver el problema. Estoy agregando mi código a continuación:

Código jQuery

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

C # código para JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

Necesito el ("Record deleted") cadena después de la eliminación exitosa. Puedo eliminar el contenido, pero no recibo este mensaje. ¿Es correcto o estoy haciendo algo mal? ¿Cuál es la forma correcta de resolver este problema?


623
2018-05-31 11:17


origen


Respuestas:


jQuery.ajax intenta convertir el cuerpo de respuesta dependiendo de lo especificado dataType parámetro o el Content-Type encabezado enviado por el servidor. Si la conversión falla (por ejemplo, si JSON / XML no es válido), se activa la devolución de llamada de error.


Su código AJAX contiene:

dataType: "json"

En este caso jQuery:

Evalúa la respuesta como JSON y devuelve un objeto JavaScript. [...]   Los datos JSON se analizan de manera estricta; cualquier JSON malformado es   rechazado y se produce un error de análisis. [...] una respuesta vacía es también   rechazado; el servidor debe devolver una respuesta de nulo o {} en su lugar.

El código del lado del servidor devuelve un fragmento de HTML con 200 OK estado. jQuery esperaba un JSON válido y, por lo tanto, desencadena la devolución de llamada de error quejándose de parseerror.

La solución es eliminar el dataType parámetro de su código jQuery y hacer que el código del lado del servidor retorne:

Content-Type: application/javascript

alert("Record Deleted");

Pero prefiero sugerir que se devuelva una respuesta JSON y mostrar el mensaje dentro de la devolución de llamada exitosa:

Content-Type: application/json

{"message": "Record deleted"}

933
2018-05-31 11:31



He tenido algo de suerte con el uso de múltiples espacios separados dataTypes (jQuery 1.5+) Como en:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

27
2018-06-15 14:47



Simplemente tiene que eliminar el dataType: "json" en tu llamada AJAX

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

24
2017-10-07 03:23



Esto es solo para el registro ya que me encontré con esta publicación cuando buscaba una solución a mi problema, que era similar a la de los OP.

En mi caso, mi solicitud jQuery Ajax no pudo tener éxito debido a política del mismo origen en Chrome. Todo se resolvió cuando modifiqué mi servidor (Node.js) para hacer:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Literalmente me costó una hora golpear mi cabeza contra la pared. Me siento estúpido ...


14
2018-06-29 08:35



Creo que su página aspx no devuelve un objeto JSON. Tu página debería hacer algo como esto (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Además, intente cambiar su AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus debería darle el tipo de error que está recibiendo.


12
2018-05-31 11:36



Me he enfrentado a este problema con una biblioteca jQuery actualizada. Si el método de servicio no devuelve nada, significa que el tipo de devolución es void.

Luego, en tu llamada Ajax, por favor menciona dataType='text'.

Resolverá el problema.


10
2018-05-11 02:10



Solo tienes que eliminar dataType: 'json' desde su encabezado si su método de servicio web implementado es nulo.

En este caso, la llamada Ajax no espera tener un tipo de datos de retorno JSON.


5
2017-11-29 23:56



Tuve el mismo problema. Mi problema era que mi controlador devolvía un código de estado en lugar de JSON. Asegúrese de que su controlador devuelva algo como:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

3
2018-06-25 14:53



Otra cosa que me fastidió fue usar localhost en lugar de 127.0.0.1 o viceversa Aparentemente, JavaScript no puede manejar las solicitudes de una a la otra.


1
2018-01-30 07:57