【HTTP请求 == 请求行 + 消息报头 + 请求正文 】
请求行:Method Request-URL HTTP-Version CRLF
HTTP协议定义了许多与服务器交互的方法
① PUT:请求服务器存储一个资源,并用Request-URL作为其标识。
【备注】1. 相对于POST是安全和幂等的(当操作没达到预期,我们可以不断重试,而不会对资源产生副作用。)
2. 创建操作可以使用POST,也可以使用PUT,区别在于POST是作用于一个集合资源之上(/articles)的,而PUT操作是作用在一个具体资源之上(/articles/123),再通俗点说,如果URL在客户端确定,就用PUT,如果在服务器端确定,用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么要服务端提供,这时就必须用POST。
② POST:在Request-URL所标识的资源后附加新的数据。
③ GET:请求由Request-URL所标识的资源。
④ HEAD:请求由Request-URL所标识资源的响应消息报头。
⑤ DELETE:请求服务器删除由Request-URL所标识的资源。
⑥ TRACE:请求服务器回送收到的请求信息,主要用于测试和诊断。
⑦ CONNECT:保留将来使用。
⑧ OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求。
Request-URL :统一资源标识。
HTTP-Version:HTTP的版本。
CRLF:回车换行。(/r/n)
【HTTP响应 == 状态行 + 消息报头 + 响应正文】
状态行 == HTTP-Version(协议版本) Status-Code(返回码) Reason-Phrase(状态描述) CRLF
状态码
- 1xx:指示信息--表示请求已接收,继续处理。
- 2xx:成功--表示请求已被成功接收、理解、接受。
- 3xx:重定向--要完成请求必须进行更进一步的操作。
- 4xx:客户端错误--请求由语法错误或请求无法实现。
- 5xx:服务器端错误--服务器未能实现合法的请求。
详细
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误
403 Forbidden 服务器收到请求,但拒绝提供服务。服务器通常会在响应正文中给出原因
404 Not Found 请求的资源不存在。例如,输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Service Unavaliable 服务器当前不能处理客户端请求,一段时间后,服务器可能会恢复正常。
消息报头 : 包括通用报头、请求报头、响应报头、实体报头
通用报头:
1. Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置并不会修改另一个消息处理过程中的缓存处理机制。请求时包含no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应时包含public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。
no-store:缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。
max-age:缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。
min-fresh:至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。
max-stale:指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。
only-if-cached:只有当缓存中有副本存在时,客户端才会获得一份副本。
Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。
Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。
2. Pragma:实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
3.Connection:是否需要持久连接。
close:告诉Web服务器或代理服务器,完成本次请求的响应后,断开连接,不要等待本次连接的后续请求。
Keepalive:告诉Web服务器或代理服务器,完成本次请求的响应后,保持连接,等待本次连接的后续请求。
Keep-Alive:如果浏览器请求保持连接,则该报头表明希望Web服务器保持连接多长时间(秒)
4. Date:消息发送时间。
5. Transfer-Encoding:Web服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)
6. Via:列出从客户端到OCS或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。
当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时, 会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部, 就知道该请求所经过的路由。例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)
HTTP请求头 :对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
1. Accept:告诉Web服务器自己接受什么介质类型,*/*表示任何类型。
2.Accept-Charset:浏览器告诉服务器自己能接收的字符集。
3.Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
4.Accept-Language:浏览器申明自己接收的语言。语言与字符集的区别:中文是语言,中文有多种字符集,比如big5、gb2312、gbk等
5.Authorization:当客户端接收来自Web服务器的WWW-Authenticate响应时,用该头部回应自己的身份验证信息给Web服务器。
6.If-Match:如果对象的Etag没有改变,其实也就意味着对象没有改变,才执行请求的动作,获取文档。
7.If-None-Match:如果对象的ETag改变了,其实也就意味着对象改变了,才执行请求的动作,获取文档。
8.If-Modified-Since:如果请求的对象在头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器对象没有被改变。
9.If-Unmodified-Since:如果请求的对象在头部指定的时间之后没被修改过,才执行请求的动作。
10.If-Range:浏览器告诉Web服务器,如果我请求的对象没被改变,就把我缺少的部分给我,如果对象变了,就把整个对象给我。浏览器通过发送请求对象的ETag或者自己所知道的最后修改时间给Web服务器,让其判断对象是否改变了。总是跟Range头部一起用。
11.Range:浏览器(比如Flashget多线程下载时)告诉Web服务器自己想取对象的哪部分。例如:Range:bytes=1173546
12.Proxy-Authenticate:代理服务器响应浏览器,要求提供代理身份验证信息。
13.Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。
14.Host:客户端指定自己想访问Web服务器的域名/IP地址和端口号
15.Referer:浏览器向Web服务器表明自己是从哪个网页URL获得当前请求中的网址/URL
16.User-Agent:浏览器表明自己的身份(是哪种浏览器)。例如:User-Agent:Mozilla/5.0(Window;U;Windows NT5.1;zh-CN;rv:1.8.1.14)Gecko/20080404 Firefox/2.0.0.14
HTTP响应头 :对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。
1. Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过了多长时间
2.Server:Web服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61(Unix)
3.Accept-Ranges:Web服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。Bytes:表示接受,none:表示不接受
4.Vary:Web服务器用该头部的内容告诉Cache服务器,在什么条件下才能用本响应返回的对象响应后续的请求。假如源Web服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding:gzip:Vary:Content-Encoding,那么Cache服务器会分析后续请求消息的头部,检查其Accept-Encoding,是否跟先前响应的Vary头部值一致,即是否使用相同的内容编码方法,这样就可防止Cache服务器用自己Cache里面压缩后的实体响应给不具备解压能力的浏览器。
5. WWW-Authenticate:这个响应报头域必须被包含在401(未授权)响应消息中,当客户端收到401响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization报头域的请求,例如:WWW-Authenticate:Basic realm = "Basic Auth Test",从这个响应头域,可知服务器端对我们请求的资源采用的是基本验证机制。
6. X-Frame-Options: 有三个值: DENY 表示该页面不允许在 frame 中展示, 即便是在相同域名的页面
中嵌套也不允许。 SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。 ALLOW-FROM uri 表示
该页面可以在指定来源的 frame 中展示
HTTP实体头 :响应消息和请求消息都可以包含实体信息。
1. Allow:服务器支持哪些请求方法。(如GET、POST等)
2. Location:表示客户应当去哪里提取文档,用于将接收端定位到资源的位置(URL)上。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302
3. Content-Base:解析主体中的相对URL时使用的基础URL
4. Content-Encoding:Web服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
5. Content-Language:Web服务器告诉浏览器理解主体时最适宜的自然语言
6. Content-Length
7. Content-Location:资源实际所处的位置
8.Content-MD5:主体的MD5校验和
9. Content-Range:实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth。例如,传送头500个字节次字段的形式:Content-Range:bytes0- 499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。
10.Content-Type:Web服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml Content-Type:text/html;char
【详细分类】
http://tool.oschina.net/commons/
http://www.cnblogs.com/52fhy/p/5436673.html
http://www.cnblogs.com/xiaozong/p/5732332.html
11.Etag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其ETag也会被修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供Web服务器判断一个对象是否改变了。比如前一次请求某个HTML文件时,获得了其ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发给Web服务器,然后Web服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了
12. Expires:Web服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟Web服务器验证了其有效性后,才能用来响应客户请求。
13. Last-Modified:Web服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
MIME
全称Multipurpose Internet Mail Extensions,比较确切的中文名称为“多用途互联网邮件扩展”,设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持后,意义更为显著。使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
超文本标记语言文本 .html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 .jpeg , .jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra,.ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认使用的MIME类型为标准类型。因此以x-开头来标识这个类别还没有成为标准。只要客户端和服务器共同承认这个MIME类型,即使不是标准的类型也没关系,客户端就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。
由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀 和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉 客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定 义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。
Content-type: text/html
注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。