A chamada ajax do JQuery executa erro em 200 [duplicado]
Esta pergunta já tem uma resposta aqui:
A solicitação Ajax retorna 200 OK, mas um evento de erro é acionado em vez de bem-sucedido 16 respostasMeu código de servidor c # / WebApi se parece com:
[HttpPost]
public HttpResponseMessage Logout()
{
// do some stuff here ...
return Request.CreateResponse(HttpStatusCode.OK);
}
No cliente eu faço uma chamada ajax usando jquery 2.0.3
ADICIONADO: código Jquery (datilografado) ...
var ajaxSettings: JQueryAjaxSettings = {};
ajaxSettings.type = 'POST';
ajaxSettings.data = null;
ajaxSettings.contentType = "application/json; charset=utf-8";
ajaxSettings.dataType = "json";
ajaxSettings.processData = false;
ajaxSettings.success = (data: any, textStatus: string, jqXHR: JQueryXHR) => {
console.log("Success: textStatus:" + textStatus + ", status= " + jqXHR.status);
};
ajaxSettings.error = (jqXHR: JQueryXHR, textStatus: string, errorThrow: string) => {
console.log("Error: textStatus:" + textStatus + ", errorThrow = " + errorThrow);
};
$.ajax("http://apidev.someurl.com/v1/users/logout", ajaxSettings);
ADICIONADO 2: Cabeçalhos de solicitação resultantes do código acima:
POST http://apidev.someurl.com/v1/users/logout HTTP/1.1
Host: apidev.someurl.com
Connection: keep-alive
Content-Length: 0
Cache-Control: no-cache
Pragma: no-cache
Origin: http://apidev.someurl.com
Authorization: SimpleToken 74D06A21-540A-4F31-A9D4-8F2387313998
X-Requested-With: XMLHttpRequest
Content-Type: application/json; charset=utf-8
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Referer: http://apidev.someurl.com/test/runner/apitest/index.html?
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
A resposta é 200, mas o manipulador de erros da chamada ajax é acionado em vez do manipulador de sucesso. Razão: parseerror, final inesperado da entrada.
Uma solução é alterar o código do servidor para:
return Request.CreateResponse<String>(HttpStatusCode.OK, "Logout ok");
Entendo que uma resposta vazia não é JSON válida, mas a mensagem de resposta está intencionalmente vazia. O 200 diz tudo. Os cabeçalhos de resposta são parecidos com:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://apidev.someurl.com
Access-Control-Allow-Credentials: true
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sun, 05 Jan 2014 01:20:30 GMT
Content-Length: 0
Isso é um bug no jquery? Ou o Request.CreateResponse (OK) nunca deve ser usado dessa maneira? Devo corrigir isso com alguma solução alternativa no cliente? AFAIK o servidor não está fazendo errado aqui ... alguma opinião?
EDIT: Graças ao feedback de Kevin, Nick e John, este problema ficou claro. A solução que escolho é retornar um NoContent
return Request.CreateResponse(HttpStatusCode.NoContent);
No servidor, parece que, neste caso, o código correto. No lado do cliente, isso é tratado perfeitamente pelo JQuery (o manipulador de sucesso é chamado). Obrigado a todos por esclarecer isso!
(Eu não sei a quem dar crédito pela resposta ... já que nick e kevin deram seus valiosos comentários nos comentários, o feedback de johns também acrescentou um melhor entendimento) ... se nenhuma outra sugestão for dada ... depois marque a única 'resposta' como Resposta)
Obrigado a todos!