,但是内容应该算比较用心了。与其直接照搬官方文档和一堆抽象术语,不如尝试用更通俗的方式用例子来解释。基本介绍StatusCode和ReasonPhrase用于简要描述请求的结果。常见示例:200OK,表示请求成功;404NotFound,表示没有找到请求的资源。原因短语(上面的ok和NotFound)是对状态码的解释。对于像200这样的状态码,这里的3位数字的第一位通常表示响应的类型(也有一两个例外),大致可以分为以下几类(完整的状态码表见http1.1-RFC6):状态码含义1xx请求正在处理中2xx请求处理成功3xx请求需要额外操作,常见例子如重定向4xx客户端错误导致请求未被处理5xx服务器处理错误(4,5常为用于故障排查时出现bug,前后端相互指责-_-!)下面详细介绍常用的状态码和原因短语分类。2xx200OK表示请求已经正常处理。这个比较常见,就不多说了。204NOContent表示请求成功,但响应报文不包含实体主体。通常用在客户端只需要向服务端发送信息,而不需要接受新信息的时候(这样官方抽象的描述显然不是我的风格),例如:通常使用很普通的请求类型选项它用作正式请求的预请求。本次请求只需要确认后续请求是否可以通过即可,即只需要一个结果即可,不需要其他内容。这类请求成功后会返回204。相信大家小时候都经常考试。如果我们以考题为例,那么:其他状态码可以类比为填空题:客户端提问(发送请求),服务端给出详细答案(返回实体内容)。204可以理解为判断题:客户端提出(发送请求),服务器给出判断,对错(只要响应头有状态码即可,不需要实体内容)206PartialContent字面意思意思是:只返回请求资源的一部分。这种情况下,必须要提到一个请求头Range——在一个http请求中,这个头是用来表示一个范围请求的,例如:'Range':byte=5001-10000//表示要请求的资源的5001此时这种情况下,如果服务端接受范围请求并成功处理,则返回206,并在响应头中返回'Content-Range':bytes5001-10000/10000//表示整个资源有10000字节,本次返回的范围是5001-10000字节。3xx301MovedPermanently字面意思是:资源被***重定向。在这种情况下,一般会在响应的头域Location中返回一个地址,用来表示需要一个新的地址。例如:客户端发起访问站点a的请求,此时收到的响应如下:301MovedPermanently...Location:`b.com`...//以上内容表示:亲爱的,您的资源requestedhasbeen***已转让。这里建议大家去新地址b.com访问。以后请直接访问新地址。302Found字面意思是:资源已经被临时重定向。***和301的区别,一个是临时的,一个是***:还是用上面的例子,响应如下:302Found...Location:`b.com`...//以上内容的意思是:亲,您请求的资源暂时转移了,以后可能会再次转移,所以建议您这次访问新地址b.com,以后先访问原地址。如果有什么变化,mm还是会热心的给你解答303SeeOther这个和302很像,但是有细微的差别。除了提示客户端请求Location外,还会要求在请求Location时使用GET方法。这里补充一个历史背景:当请求返回301302303时,几乎所有的浏览器都会将原来的POST请求变成GET请求。虽然FRC1945和RFC2068规范中有规定:客户端在重定向时不允许修改方法。简单的说,实际浏览器在处理301和302的时候,会默认把原来的POST请求变成GET请求,所以使用303的意思也只是让语义更清晰。(303的意思是服务器端明确的告诉客户端你要用GET方式访问位置;如果是302,只是告诉客户端访问位置,不限制方法,但实际上客户端也会使用GET方法访问。)304NotModified字面意思是:资源没有改变,可以直接使用缓存。这种响应一般是在GET请求中附加条件,如请求头中的if-Match、if-Modified-Since等(if-Match表示只请求带有特殊标签的资源,if-Modified-Since表示请求指定时间后没有变化的Resources,因为本文主要讲解状态码,所以这里就不过多介绍httpheader的相关内容了,这里简单说明一下additional的意思有条件的请求)。在这种情况下,服务器将不会返回响应主体,这意味着:“此资源自您上次访问以来没有发生变化,只是使用您的本地缓存。”304是3xx的特例,因为它不被视为重定向。(一般我们认为重定向应该给客户端访问一个新的地址,如果304一定要解释为重定向,那只能解释为允许客户端访问缓存-_-)307TemporaryRedirect这个重定向是Inorder解决刚才介绍的一个历史背景问题:当302时,浏览器会默认切换到GET方式请求Location,如果是307,意思就是严禁从POST切换到GET。这在我目前的实际工作中是非常困难的。很少遇到。4xx4xx表示客户端出错。(这位前端同学,乖乖接受这个bug吧!)400BadRequest(这个状态码相信大家一定很熟悉,尤其是入门的新同学~)400的意思简单粗暴:“Sorry,yourrequestcontainsGrammaticalerror”,语法错误到底是什么?答案是——不一定,一般来说,响应消息中会有一些提示,比如:“哦,你加了什么请求头,我不能接受”“哦,你是不是写错地址了,thisuridoesnotexist”“哦,你是不是请求方式有误,这个uri只能put而不是post”请大家补充...401Unauthorized字面意思:未认证。一般在后台系统等应用中,用户登录后会获取一个身份认证信息,然后生成mac等信息,放在请求头的Authorization字段中,发送给服务器。如果没有发送,就会出现这个状态码。403Forbidden很简单:forbiddenaccess就是未经授权的访问。至于为什么禁止,服务器可以在响应内容的entity部分给,当然不能给(是的,我的服务器太牛了,我可以为所欲为!)404NotFound很common,字面意思就是服务器没有找到所有请求的资源,经验表明,一般这个错误是客户端的请求url写错了。(别问我怎么知道的)5xx5xx表示服务端出错。(真是喜讯,老大,你看,不是我的问题!)500InternalServerError简单粗暴,服务器出故障了。什么?你问我怎么了?不知道,我只会巧妙的把bug传给隔壁的服务器同学。503ServiceUnavailable服务器暂时不可用,可能正在维护或升级,但无论如何都不可用。小结本文总结了一些常见的http状态码及其原因。一方面,希望能帮助到更多入门的同学。另一方面,我也做一个总结,方便排bug时快速检查。有些文章可能会涉及到虽然我想把httpheader的知识尽量分开,但是为了便于说明,完全分开是不可能的-_-。
