如何从 jQuery.ajax 获取响应状态码?
Posted
技术标签:
【中文标题】如何从 jQuery.ajax 获取响应状态码?【英文标题】:How to get response status code from jQuery.ajax? 【发布时间】:2011-07-17 16:19:07 【问题描述】:在下面的代码中,我要做的就是从 jQuery.ajax 调用中获取 HTTP 响应代码。然后,如果代码是 301(永久移动),则显示 'Location' 响应头:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>jQuery 301 Trial</title>
<script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>
<script type="text/javascript">
function get_resp_status(url)
$.ajax(
url: url,
complete: function (jqxhr, txt_status)
console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
// if (response code is 301)
console.log ("Location: " + jqxhr.getResponseHeader("Location"));
//
);
</script>
<script type="text/javascript">
$(document).ready(function()
$('a').mouseenter(
function ()
get_resp_status(this.href);
,
function ()
);
);
</script>
</head>
<body>
<a href="http://ow.ly/4etPl">Test 301 redirect</a>
<a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>
有人能指出我哪里出错了吗?当我在 Firebug 中检查“jqxhr”对象时,找不到状态代码,也找不到“Location”响应标头。我在“完成”的最后一行设置断点。
非常感谢。
【问题讨论】:
api.jquery.com/jQuery.ajax 我知道这是旧的,但我想我解决了它(XHR.responseURL):***.com/a/39416846/4946681 【参考方案1】:我在 jqXhr 对象上看到了状态字段,这是它的工作原理:
http://jsfiddle.net/magicaj/55HQq/3/
$.ajax(
//...
success: function(data, textStatus, xhr)
console.log(xhr.status);
,
complete: function(xhr, textStatus)
console.log(xhr.status);
);
【讨论】:
它似乎在 jsFiddle 中工作。基于此和 jQuery 文档, xhr.status 应该做我想要的。但是,当我在原始代码中尝试相同的操作(txt_status 替换为 jqxhr.status)时,jqxhr.status 一直为 0。这是截图:twitpic.com/4alsqj 我认为问题在于您不是针对 Web 服务器运行,而是从文件系统本地运行。我认为如果您启动本地 Web 服务器,这将正常工作,这里有一些关于该主题的文章:pearweb.com/javascript/XMLHttpRequest.htmldeveloper.mozilla.org/En/Using_XMLHttpRequest“这里要注意的关键是结果状态与 0 进行比较表示成功而不是200.这是因为文件和ftp方案不使用HTTP结果码。” 这很棒。尤其是当我可以让我的后端发送状态码时。 请注意,如果响应是像 302 这样的重定向状态,这将给出 200【参考方案2】:我自己在寻找类似解决方案时遇到了这个旧线程,并发现接受的答案是使用jquery ajax
的.complete()
方法。我在这里引用jquery website 的通知:
jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调在 jQuery 1.8 中被弃用。要为最终删除代码做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。
要知道ajax响应的status code
,可以使用以下代码:
$.ajax( url [, settings ] )
.always(function (jqXHR)
console.log(jqXHR.status);
);
.done()
和 .fail()
的工作方式类似
【讨论】:
返回“未定义”【参考方案3】:使用传递给 $.ajax 函数的参数对象的 statusCode 属性可能更符合 jQuery 的习惯:
$.ajax(
statusCode:
500: function(xhr)
if(window.console) console.log(xhr.responseText);
);
但是,正如Livingston Samuel 所说,无法在javascript中捕获301状态代码。
【讨论】:
当我试图捕捉这样的多个状态码时,net::ERR_CONNECTION_RESET 诅咒。有解决这个问题的想法吗? 它不适用于重定向【参考方案4】:当您的 XHR 请求返回重定向响应(HTTP 状态 301、302、303、307)时,XMLHttpRequest
automatically follows the redirected URL and returns the status code of that URL。
您可以通过 xhr 对象的status
属性获取非重定向状态代码(200、400、500 等)。
因此,您无法从 301
、302
、303
或 307
请求的响应标头中获取重定向位置。
您可能必须更改您的服务器逻辑,以便以您可以处理重定向的方式进行响应,而不是让浏览器来处理。一个example implementation。
【讨论】:
【参考方案5】:您可以检查您的响应内容,只需 console.log 即可,您将看到 whitch 属性有一个状态码。不了解jsons的可以参考视频:https://www.youtube.com/watch?v=Bv_5Zv5c-Ts
它解释了非常基础的知识,让您对 javascript 感到更自在。
您可以使用更短版本的 ajax 请求来完成,请参阅上面的代码:
$.get("example.url.com", function(data)
console.log(data);
).done(function()
// TO DO ON DONE
).fail(function(data, textStatus, xhr)
//This shows status code eg. 403
console.log("error", data.status);
//This shows status message eg. Forbidden
console.log("STATUS: "+xhr);
).always(function()
//TO-DO after fail/done request.
console.log("ended");
);
控制台输出示例:
error 403
STATUS: Forbidden
ended
【讨论】:
感谢您提供如何使用 done、fail 和 always 的完整代码,以及完整的函数参数。【参考方案6】:注意:使用 jQuery 3.4.1
$.ajax(
url: URL,
success: function(data, textStatus, jqXHR)
console.log(textStatus + ": " + jqXHR.status);
// do something with data
,
error: function(jqXHR, textStatus, errorThrown)
console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
);
【讨论】:
【参考方案7】:jqxhr 是一个 json 对象:
完整返回: jqXHR(在 jQuery 1.4.x 中, XMLHTTPRequest) 对象和一个字符串 对请求的状态进行分类 (“成功”,“未修改”,“错误”, “超时”、“中止”或“解析器错误”)。
见: jQuery ajax
所以你会这样做:
jqxhr.status
获取状态
【讨论】:
以上是关于如何从 jQuery.ajax 获取响应状态码?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 REST API 获取响应并从 jquery ajax 调用执行操作?