Android 网络交互(六) HTTP协议续章和状态码须知

今天我来给大家继续带来网络交互的未完之路,主要讲的就是HTTP协议。在之前的文章Android 网络交互(一) HTTP post和get方法区别我们已经讲过HTTP协议介绍,HTTP协议特点,HTTP请求的方法和区别。其中HTTP1.0版本是短连接的(一次连接),但是HTTP1.0版本就支持了长连接。

HTTP协议最显著特点就是短连接,下面我们来简单回顾下:

短连接:
   连接->传输数据->关闭连接
   HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
长连接:
    连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
HTTP的长连接:
   HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。在HTTP1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持,但还是无状态的,或者说是不可以信任的。

HTTP 头信息解读:

HTTP的头域包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成(说白了就是键值对)。

1.通用头标:既可用于请求,也可用于响应,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部。
2.请求头标:是请求报文特有的,允许客户端传递关于自身的信息和希望的响应形式。
3.响应头标:便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部。
4.实体头标:定义被传送资源的信息。既可用于请求,也可用于响应。

HTTP通用头:通用头域包含请求和响应消息都支持的头域,通用头域包含缓存头部Cache-Control、Pragma及信息性头部Connection、Date、Transfer-Encoding、Update、Via。

HTTP通用头:

1.Cache-Control:Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

请求:no-cache(不要缓存的实体,要求现在从WEB服务器去取)
         max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象)
         max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值)
         min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应:public(可以用 Cached 内容回应任何用户)
          private(只能用缓存内容回应先前请求该内容的那个用户)

         
 no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后, 才能返回给客户端)

          max-age:(本响应包含的对象的过期时间)
ALL:  no-store(不允许缓存)

2.connection:是否需要持久连接。

请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
              keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
        
响应:close(连接已经关闭)。

      keepalive(连接保持着,在等待本次连接的后续请求)。

3.Date:Date头域表示消息发送的时间,服务器响应中要包含这个头部,因为缓存在评估响应的新鲜度时要用到.

4.Pragma:Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同

5.Transfer-Encoding:WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码。

6.Upgrade:允许服务器指定一种新的协议或者新的协议版本,如HTTP/1.1客户端可以向服务器发送一条HTTP/1.0请求,其中包含值为“HTTP/1.1”的Update头部。

7.Via:列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。

HTTP请求头:

请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

8.Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

9.Accept-Charset:浏览器告诉服务器自己能接收的字符集。

10.Accept-Encoding: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。

11.Accept-Language:浏览器申明自己接收的语言。

12.Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。

13.Host:客户端指定自己想访问的服务器的域名/IP地址和端口号。

14. If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。

15.If-None-Match:如果对象的 ETag 改变了才执行请求的动作

16.If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求 的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。

17.If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作

18.If-Range:浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否 改变了,变了需要返回所有,不变则返回缺少的。总是跟 Range 头部一起使用。

19.Range:浏览器告诉服务器自己想取对象的哪部分。例如:Range: bytes=1173546-

20.Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。

21.Proxy-Authorization:浏览器响应代理服务器的身份验证请求,告知自己的身份信息。

22.Referer:浏览器向WEB服务器表明自己是从哪个网页/URL,获得/点击当前请求中的网址/URL。

23.User-Agent:浏览器表明自己的类型。

HTTP响应头:

响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

24.Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

25.Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件 的一部分)的请求。bytes:表示接受,none:表示不接受。

26.Server:服务器表明自己是什么软件及版本等信息。

27.Vary:WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。

HTTP实体头:

实体头部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括信息性头部Allow、Location,内容头部Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type,缓存头部Etag、Expires、Last-Modified、extension-header。

28.Allow:服务器支持哪些请求方法(如GET、POST等)。

29.Content-Base:解析主体中的相对URL时使用的基础URL。

30.Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。

31.Content-Language;WEB服务器告诉浏览器理解主体时最适宜使用的自然语言。

32.Content-Length:WEB服务器告诉浏览器自己响应的对象的长度或尺寸

33.Content-Location:资源实际所处的位置。

34.Content-MD5:MD5的校验和。

35.Content-Range:随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度

36.Content-Type:表明发送或者接收的实体的MIME类型。

37.Etag:一种实体头标,它向被发送的资源分派一个唯一的标识符。比如一个html文件,如果被修改了,其Etag也会别修改

38.Expires:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。

39.Last-Modified:WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。

40.Location:对于一个已经移动的资源,用于重定向请求者至另一个位置。

HTTP 请求消息头部实例:
Hostrss.baidu.com.cn
User-Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20141128 CHROME/2.0.0.14
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language:
zh-cn,zh;q=0.5
Accept-Encoding:
gzip,deflate
Accept-Charset:
gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:
300
Connection:
keep-alive
Cookie:
userId=C5bYpXrimdmsiQmsBPnE1Vn8ZQmdWSm3WRlEB3vRwTnRtW   <-- Cookie 
If-Modified-Since:
Sun, 01 Jun 2008 12:05:30 GMT
Cache-Control:
max-age=0
HTTP 响应消息头部实例:

Status:OK - 200                                                <-- 响应状态码,表示 web 服务器处理的结果。 
DateSun, 28 Nov 2014 12:35:47 GMT
Server:
Apache/2.0.61 (Unix)
Last-Modified:
Sun, 28 Nov 2008 12:35:30 GMT
Accept-Ranges:
bytes
Content-Length:
18616
Cache-Control:
max-age=120
Expires:
Sun, 01 Jun 2008 12:37:47 GMT
Content-Type:
application/xml
Age:
2
X-Cache:HIT from 236-41.D07071951.sina.com.cn                  <-- 反向代理服务器使用的 HTTP 头部

Via1.0 236-41.D07071951.baidu.com.cn:80 (squid/2.6.STABLE13)
Connection:
close

下面我们来看看HTTP的状态码的分类:

1**:请求收到,继续处理(信息性状态码,由HTTP1.1引入,表示临时相应,并要求客户端继续操作的状态码
2**:操作成功收到,分析、接受(成功状态码,成功处理了请求
3**:完成此请求必须进一步处理(重定向状态码,表示完成需求,需要进一步操作)
4**:请求包含一个错误语法或不能完成(客户端错误状态码,请求可能出错,妨碍了服务器的处理
5**:服务器执行一个完全有效请求失败(服务器错误状态码,表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错

我们来看些具体的各类中具体的状态码:
100(继续):客户端必须继续发出请求

101(切换协议):客户端要求服务器根据请求转换HTTP协议版本

200(成功):请求成功。

201(已创建):请求已经被实现,而且有一个新的资源已经依据请求的需要而创建。

202(已接受):服务器已接受请求,但尚未处理。

203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。

204(无内容):请求收到,但返回信息为空(只有一些Header和一个状态行,没有内容

205(重置内容):服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文件。

206(部分请求):服务器已经成功处理了部分GET请求。该请求必须包含Range头信息来指示客户端希望得到的内容范围,并且可能包含If-Range来作为请求条件。

207:代表之后的消息体将是一个XML消息。

300(多种选择): 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。

301(永久移动):被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。

302(找到):请求的资源现在临时从不同的URI响应请求。

303(参见其他):对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。

304(未修改):如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。

305(使用代理):请求者只能使用代理访问请求的网页。

307(临时重定向):服务器当前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

400(错误请求):发送的请求中的数据有错误(比如:表单有错误,Cookie有错误),  或者语法错误。

401(未授权):请求需要客户端验证。如果当前请求已经包含了Authorization证书,那么401响应代表着服务器验证已经拒绝了 那些证书。

402:为新需求预留的状态码。

403(禁止):服务器拒绝请求。

404(未找到):请求失败,请求所希望得到的资源未被在服务器上发现。

405(方法禁用):服务器不支持请求的方法。

406(不接受):无法使用请求的内容特性响应请求的网页。

407(需要代理授权):此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。

408(请求超时):客户端没有在用户指定的饿时间内完成请求

409(冲突):服务器在完成请求时发生冲突

410(已删除):服务器上不再有此资源且无进一步的参考地址

411(请求有效长度):服务器拒绝在没有定义Content-Length头的情况下接受请求。当浏览器使用Post方法,发送数据给Web服务器时, 必须要有Content-Length。

412(为满足前提条件):服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。

413(请求实体过大): 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

414(请求的URI过长):请求的URI长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。

415(不支持的媒体类型):请求的格式不受请求页面的支持。

416(请求范围不符合):如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。(请求的页面不支持请求的范围)

417(未满足预期):服务器未满足”期望”请求标头字段的要求

500(服务器内部错误):服务器遇到错误,无法完成请求

501(未实现):客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码)

502(网关故障):网关或代理使用的服务器遇到了上游的无效响应。

503(服务不可用):由于临时的服务器维护或者过载,服务器当前无法处理请求。

504(网关超时):作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器收到响应。

505(不支持的HTTP版本):Web服务器不支持此HTTP协议的版本。

508(带宽限制):服务器达到带宽限制。

在我们的开发中呢, 我觉得大家不必都要掌握这些状态码,不过要知道,具体掌握一些状态码就行了,比如200,204,305,307.400,401,403,404,500,503,501,掌握这些,我觉得足以应对应用开发过程中的大部分情况了。又写到这么晚了,周五开始,周六一天全在这上面了,现在已经是周日凌晨3点多了,终于算是写完了,欢迎大家指正,突然觉得好累啊,希望对大家有帮助。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值