X.d 笔记

小Web,大世界

0%

HTTP小结之二:状态码

整理一下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>