伯虔
伯虔
发布于 2016-11-14 / 946 阅读
0

学习提升之HTTP状态码详解

最近太忙了,不好意思,没有更新博客,所以今天抽空把这些天积累的知识都写下来与大家分享。这篇文章是我在学习网络部分的一些学习笔记,在这里分享给大家。之前看到状态码都是搜索下就完事,常用的也都记得,毕竟搭建博客等过程深入学习过这些。下面进入正题,在讲解状态码之前先了解下其他相关的知识,涉及的内容可能比较多,大家耐心看看,学习的过程就是如此,一个知识点发散思维。

先记录下iOS中发送HTTP请求的方案

苹果原生(自带)

  • NSURLConnection:用法简单,最古老最经典最直接的一种方案【坑比较多】
  • NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】
  • CFNetwork:NSURL*的底层,纯C语言

第三方框架

  • ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新
  • AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多
  • MKNetworkKit:简单易用,产自三哥的故乡印度,维护和使用者少

必要知识了解

1.URL

1.1 什么是URL?

URL的全称是Uniform Resource Locator(统一资源定位符)
通过1个URL,能找到互联网上唯一的1个资源
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式 = 协议://主机地址/路径

2.URL中常见的协议

2.1 HTTP

超文本传输协议,访问的是远程的网络资源,格式是http://,http协议是在网络开发中最常用的协议

2.2 file

访问的是本地计算机上的资源,格式是file://(不用加主机地址)

2.3 mailto

访问的是电子邮件地址,格式是mailto:

2.4 FTP

访问的是共享主机的文件资源,格式是ftp://

3.TCP/IP协议簇

  • 为了能够理解HTTP,我们需要先了解TCP/IP协议簇。通常意义上,我们使用的网络是在TCP/IP协议簇的基础上运作的,而HTTP属于它内部的一个子集。
  • 计算机与网络设备需要通信,双方就必须要基于相同的方法,比如具体应该如何探测通信目标,由哪一方面发起通信,使用什么语言进行沟通等等,所有的这一切都需要规则。而我们则把这些规则称之为协议(potocol)。
  • 在协议中规定了很多的各式各样的内容,如选址方法,双方建立通信的顺序等等。这些协议如(ICMP DNS TCP FTP HTTP SNMP PPPoE IP FDDI)等等,通常我们把TCP/IP认为是在IP协议的通信过程中,使用到的协议簇的统称。
  • TCP 协议簇里面最重要的一点就是分层设计:按照层次分别分为应用层、传输层、网络层和数据链路层。其中,与HTTP关系密切的协议有TCP、IP、DNS等。

4.TCP/IP参考模型

68_tcpip01.png

5.HTTP协议简介

5.1 不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议

5.2 HTTP协议的作用

  • HTTP的全称是Hypertext Transfer Protocol,超文本传输协议
  • 规定客户端和服务器之间的数据传输格式
  • 让客户端和服务器能有效地进行数据沟通

6.HTTP协议的特点(为什么选择HTTP)

6.1 简单快速

因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快。

6.2 灵活

HTTP允许传输各种各样的数据。

6.3 HTTP 0.9和1.0使用非持续连接

限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间。

HTTP协议里面的状态码:

何谓HTTP状态码

HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事。

状态码位于HTTP Response 的第一行中,会返回一个”三位数字的状态码“和一个“状态消息”。 ”三位数字的状态码“便于程序进行处理, “状态消息”更便于人理解。

状态码分类

HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码。随着协议的发展,HTTP规范中会定义更多的状态码。

状态码 已定义范围 分类
1XX 100-101 信息提示
2XX 200-206 成功
3XX 300-305 重定向
4XX 400-415 客户端错误
5XX 500-505 服务器错误

常见的状态码

一般常见的状态码已经够使用的,我之前弄博客的时候几乎每天都要见到,不是301就是501,幸运的就是200完美!
68_statuscode02.png

1XX 信息性状态码

信息性状态码,表示接受的请求正在处理。

状态码 状态消息 含义
100 Continue(继续) 收到了请求的起始部分,客户端应该继续请求
101 Switching Protocols(切换协议) 服务器正根据客户端的指示将协议切换成Update Header列出的协议

2XX 成功状态码

2xx 响应结果表示从客户端发来的请求在服务器端被正常处理了。

状态码 状态消息 含义
200 OK 服务器成功处理了请求(这个是我们见到最多的)
201 Created(已创建) 对于那些要服务器创建对象的请求来说,资源已创建完毕。
202 Accepted(已接受) 请求已接受, 但服务器尚未处理
203 Non-Authoritative Information(非权威信息) 服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。
204 No Content(没有内容) Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body)
205 Reset Content(重置内容) 另一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上所有的HTML表单。
206 Partial Content(部分内容) 部分请求成功

3XX 重定向状态码

3XX 响应结果表明浏览器需要执行某些特殊的处理以完成请求。重定向状态码用来告诉浏览器客户端,它们访问的资源已被移动, Web服务器发送一个重定向状态码和一个可选的Location Header, 告诉客户端新的资源地址在哪。之前改域名做SEO优化的时候经常会碰到301重定向。

状态码 状态消息 含义
300 Multiple Choices(多项选择) 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了
301 Moved Permanently(永久移除) 请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
302 Found(已找到) 与状态码301类似。但这里的移除是临时的。 客户端会使用Location中给出的URL,重新发送新的HTTP request
303 See Other(参见其他) 类似302
304 Not Modified(未修改) 客户的缓存资源是最新的, 要客户端使用缓存
305 Use Proxy(使用代理) 必须通过代理访问资源, 代理的地址在Response 的Location中
306 未使用 这个状态码当前没使用
307 Temporary Redirect(临时重定向) 类似302

4XX客户端错误状态码

有时客户端会发送一些服务器无法处理的东西,比如格式错误的Request, 或者最常见的是, 请求一个不存在的URL。

状态码 状态消息 含义
400 Bad Request(坏请求) 告诉客户端,它发送了一个错误的请求。
401 Unauthorized(未授权) 需要客户端对自己认证
402 Payment Required(要求付款) 这个状态还没被使用, 保留给将来用
403 Forbidden(禁止) 请求被服务器拒绝了
404 Not Found(未找到) 未找到资源
405 Method Not Allowed(不允许使用的方法) 不支持该Request的方法。
406 Not Acceptable(无法接受)
407 Proxy Authentication Required(要求进行代理认证) 与状态码401类似, 用于需要进行认证的代理服务器
408 Request Timeout(请求超时) 如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接
409 Conflict(冲突) 发出的请求在资源上造成了一些冲突
410 Gone(消失了) 服务器曾经有这个资源,现在没有了, 与状态码404类似
411 Length Required(要求长度指示) 服务器要求在Request中包含Content-Length。
412 Precondition Failed(先决条件失败)
413 Request Entity Too Large(请求实体太大) 客户端发送的实体主体部分比服务器能够或者希望处理的要大
414 Request URI Too Long(请求URI太长) 客户端发送的请求所携带的URL超过了服务器能够或者希望处理的长度
415 Unsupported Media Type(不支持的媒体类型) 服务器无法理解或不支持客户端所发送的实体的内容类型
416 Requested Range Not Satisfiable(所请求的范围未得到满足)
417 Expectation Failed(无法满足期望)

5XX服务器错误状态码

有时候客户端发送了一条有效Request, Web服务器自身却出错了。 可能是Web服务器运行出错了, 或者网站都挂了。  5XX就是用来描述服务器错误的。

状态码 状态消息 含义
500 Internal Server Error(内部服务器错误) 服务器遇到一个错误,使其无法为请求提供服务
501 Not Implemented(未实现) 客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码。
502 Bad Gateway(网关故障) 代理使用的服务器遇到了上游的无效响应
503 Service Unavailable(未提供此服务) 服务器目前无法为请求提供服务,但过一段时间就可以恢复服务
504 Gateway Timeout(网关超时) 与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时
505 HTTP Version Not Supported(不支持的HTTP版本) 服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持太高的协议版本

下面是表格里的状态码的一些详细说明,供强迫症患者食用

204 No Content(没有内容)

该状态码表示服务器接收到的请求已经处理完毕,但是服务器不需要返回响应体.
比如,客户端是浏览器的话,发出的请求返回204响应,那么浏览器显示的页面不会发生更新。

206 Partial Content(部分内容)

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。
客户端发起的请求,必须在请求头中包含Range字段。服务端响应报文中,必须包含由Content-Range指定范围的实体内容(entity-bodies )

301 Moved Permanently(永久移除)

永久性重定向。该状态码表示请求的资源已经被分配了新的URI,并且以后使用资源现在所指的URI。并且根据请求的方法有不同的处理方式:
HEAD:必须在响应头部Location字段中指明新的永久性的URI。
GET:除了有Location字段以外,还需要在响应体中附上永久性URI的超链接文本。
POST:客户端在发送POST请求,受到301响应之后,不应该自动跳转URI,应当让用户确认跳转。

302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。
和301 Moved Permanently 状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。
如果,用户把一个URI收藏为书签,302响应是不会像301那样去更新书签。

比如访问:
http://www.huangbowei.cn/
或者http://iosdev.vip/

请求会被重定向到:
http://www.huangbowei.com/
3.10 303 See Other

该状态码表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。303与302不同之处在于,302是不会改变请求的方法,如果请求方法是POST的话,重定向的请求也应该是POST。而对于303,使用POST请求的话,重定向的请求应该是GET请求。

304 Not Modified

该状态码表示客户端发送附带条件请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主题部分。

307 Temporary Redirect

临时重定向。该状态码与302和303的有着类似的含义,不同之处在于,307状态码并不会指定客户端要用什么样的请求方法请求重定向地址。(302指定使用原有请求方法,303指定使用GET方法)

400 Bad Request(坏请求)

表示该请求报文中存在语法错误,导致服务器无法理解该请求。客户端需要修改请求的内容后再次发送请求。

401 Unauthorized(需要认证)

该状态码表示发送的请求需要有通过HTTP认证(Basic认证,Digest认证)的认证信息。返回含有401的响应,必须在头部包含WWW-Authenticate以指明服务器需要哪种方式的认证。

403 Forbidden(禁止)

该状态码表明对请求资源的访问被服务器拒绝了。服务器没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主体部分原因进行描述,这样就能让用户看到了。
未获得文件系统的访问权限,访问权限出现某些问题,从未授权的发送源IP地址试图访问等情况都可能发生403响应。

404 Not Found(无法找到指定的资源)

该状态码表明服务器上无法找到指定的资源。通常被用于服务器不想透露拒绝请求的原因,或者没有其他的响应可提供。

405 Method Not Allowed(不允许使用的方法)

405是指Web服务器不支持Request中的方法。

411 Length Required(要求长度指示)

服务器要求在Request中包含Content-Length。当浏览器使用Post方法,发送数据给Web服务器时, 必须要有Content-Length。这样Web服务器才知道你要发送多少数据,否则Web服务器会返回411状态码

413 Request Entity Too Large(请求实体太大)

作用:客户端发送的实体主体部分比服务器能够或者希望处理的要大。  一般情况下我们看不到这个状态码。 因为浏览器不会发送太大的数据给网站,但是机器人可能会。

414 Request URI Too Long(请求URL太长)

就是说Request URI太长, 一般浏览器本身对URI的长度就会有限制,所以不会发送URI很长的Request. 我们平常是根本看不到414错误的。 但是机器人可以发送很长URI。

500 Internal Server Error(内部服务器错误)

该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的BUG或某些临时的故障。弄博客的时候经常见,哈哈哈。

501 Not Implemented(未实现)

客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码)。  一般的Web服务器只支持GET和POST方法。

502 Bad Gateway(网关故障)

代理使用的服务器遇到了上游的无效响应。当我们访问www.youtube.com,就可以看到熟悉的502了。

503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上需要的时间,最好写入Retry-After首部字段再返回给客户端。

505 HTTP Version Not Supported(不支持的HTTP版本)

表示Web服务器不支持此HTTP协议的版本。

参考文章: HTTP协议之状态码详解