整理一下HTTP的基础知识:(二):响应状态码
响应码,整理了一份:
一般来说,我们平常见的响应码就那么几个,200/304/404/500等,一般是浏览器自身做的时候觉得体验不好,把一些响应码特殊处理了,并没有支接让你看到。
响应码主要分为以下5类
码段 | 类型 |
---|---|
1XX | 消息 |
2XX | 成功状态 |
3XX | 转向 |
4XX | 请求错误 |
5XX | 服务器内部错误 |
1XX
1XX状态码 是比较少用的,暂时不做多讲
状态码 | 类型 | 说明 |
---|---|---|
100 | Continue | 需要继续处理 |
101 | Switching Protocols | 切换协议,这时一般会响应一个Upgrade响应头。 |
2XX
2XX 也比较少,照我理解,顺序应该是203-202-201-200/204/205/206,即使使用工具调试记状态,也是忽然碰出一个200前面的状态没出现过。
状态码 | 类型 | 说明 |
---|---|---|
200 | OK | 请求成功 |
201 | Created | 请求已经被实现,一个资源已经根据请求的需要创建。 |
202 | Accepted | 请求已经被接受,正在处理中。 |
203 | Non-Authoritative Information | 服务器处理了请求,但不确定响应内容的正确性。与200类似。 |
204 | No Content | 服务器已经处理了请求。但不需要返回任何内容。 |
205 | Reset Content | 与204一样,处理完请求不返回内容,客户端去判断204的话,可以提示用户重新提交表单等。 |
206 | Partial Content | 服务器已经处理了部分内容,通常是下载工具使用这个。一般这个响应码会有Content-Range,Date,Expires,Content-Length等响应头信息告诉客户端状态便下一步处理 |
3XX
3XX,转向,这里是很常用的,301,302,304都相当常见301和302类似,301说明的意义是永久转向,SEO常用的状态码,304是响应没有更新,让客户端去取缓存。通常仅GET方法会响应3XX状态码,POST方法不会。有时开发经验较浅的程序猿会经常被3XX错误码搞乱,特别是IE上,会理解为一些“神奇的现象”。如果是跳转,通常会带Location头信息。
状态码 | 类型 | 说明 |
---|---|---|
300 | Multiple Choices | 有多个重定向的地址可供浏览器选择 |
301 | Moved Permanently | 301转向,链接永久 转向 |
302 | Found | 302转向,程序内部跳转 |
303 | See Other | 与302类似,一般使用302.当前请求的资源可以在另一个GET请求找到。 |
304 | Not Modified | 自上一次请求后没有更新过,提示客户端使用缓存,一般304状态时,响应一个头即可,不用响应具体内容。一般,这个状态码会返回Date,Etag,Expire,Last-Modify等等缓存相关的信息。 |
305 | Use Proxy | 需要代理才能访问,Location指向代理地址 |
307 | Temporary Redirect | 语义区别:301=永久转向,302=功能性转向,303=资源在另外一个URL上,307=另外一个URL临时提供资源信息。简单点说,一般就使用302就够了。 |
4XX
4XX 4XX错误是相当多的,但常见的也只有401,403,404等。可能是现在浏览器的兼容做的很好了,一些弱智的错误就少见了。
状态码 | 类型 | 说明 |
---|---|---|
400 | Bad Request | 语法错误,HTTP语法请看HTTP小结之一:请求方法与命令调试 |
401 | Unauthorized | 没有授权,缺少Authorized头或头没有验证通过(在路由器登录不上) |
402 | Payment Required | 要支付才能看吗?貌似各服务器还没有这个状态码的实现,也从没见过。 |
403 | Forbidden | 禁止访问,一般是服务器配置了某规则资源不许访问 |
404 | Not Found | 没有相应的资源 |
405 | Method Not Allowed | 不允许的方法,一般服务器会禁用PUT/POST之外的方法以免黑客攻击 |
406 | Not Acceptable | 请求资源内容不满足请求头里面指定的条件,不响应实体 |
407 | Proxy Authentication Required | 和401差不多,只不是代理认证失败。 |
408 | Request Time-out | 如果你使用telnet调试HTTP,会发现这个也很常见 |
409 | Conflict | 请求与当前资源存在冲突。通常是PUT请求的时候,别人先PUT了一下,是不是该先GET一下再PUT呢(有SVN,GIT味道) |
410 | Gone | 和404一样,有语义的:说明文件已经永久没有,比如301和302的区别,有SEO的味道,但SEO也不会使用这样的码吧。 |
411 | Length Required | 请求头没有Content-Length,而服务器又需要。通常是上传文件时响应。 |
412 | Precondition Failed | 请求头不符合要求,没有其中一个或多个。 |
413 | Request Entity Too Large | 请求体太大了。 |
414 | Request-URI Too Large | 请求的URI 太长了。 |
415 | Unsupported Media Type | 请求指定的MIME格式不能被服务器响应。 |
416 | Requested range not satisfiable | 请求里面的RANGE的范围不能被服务器满足响应。 |
417 | Expectation Failed | E请求里面Expect的指定不能被服务器满足。 |
5XX
5xx 5XX就这几个,简单明了。而且都常用。
状态码 | 类型 | 说明 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,基本都是代码问题引起的。 |
|501|Not Implemented|服务器不知道该怎么响应请求。|
|502|Bad Gateway|上游服务器没有响应。|
|503|Service Unavailable|服务不可用,一般是服务器过载原因。|
|504|Gateway Time-out|服务超时,一般也是服务器调用的某些服务过载原因。|
|505| HTTP Version not supported|版本不支持,服务器只支持HTTP1.0,客户端发了个HTTP1.1。目前没有,可能等HTTP1.2出来后这个错误码会被发扬光大吧。|
说明
与上小结一样,这里面只是统计了标准的响应码而已,一些厂商或联盟推出了N多其它的扩展码,而且很多都已经实用,就不多说了。
有102,207,418,419等等二十个左右的状态码,有兴趣可自己搜索相关资料。
说了到响应码,顺带一提也说个请求码吧,也不说了,简单贴一段代码自己看吧
<html>
<head>
<meta charset="utf-8" />
<title>ajax状态码</title>
<script type="text/javascript">
function ajax(url){
var xhr=null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var states={
'0':'请求未初始化',
'1':'服务器连接已建立',
'2':'请求已接收',
'3':'请求处理中',
'4':'请求已完成'
}
xhr.onreadystatechange = function() {
console.log('请求状态:'+states[xhr.readyState]+' 响应状态码:'+xhr.status);
}
xhr.open("GET", url, true);
xhr.send();
};
function send(){
ajax('/xxxd.html');
}
</script>
</head>
<body>
<button onclick="send()">test</button>
</body>
</html>