一,HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文称为请求报文,响应端(服务器端)的叫做响应报文。
HTTP报文大致可分为报文首部和报文主体两部分,两者由最初出现的空行(CR+LF)来划分。通常并不一定要有报文主体。
请求报文和响应报文的首部内容由以下数据组成:
1,请求行
包含用于请求的方法,请求URI和HTTP版本;
2,状态行
包含表明响应结果的状态码,原因短语和HTTP版本;
3,首部字段
包含表示请求和响应的各种条件和属性的各类首部;一般有四个首部,分别是:通用首部、请求首部、响应首部和实体首部;
4,其他:
可能包含HTTP的RFC里未定义的首部(Cookie等)。
报文主体和实体主体的差异
报文是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。实体是作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
报文的主体用于传输请求或响应的实体主体。通常报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化,才与报文主体产生差异。
HTTP协议中有一种被称为内容编码的功能,使邮件容量变小,以ZIP压缩文件添加附件放松。常用的内容编码有以下几种:
1,GZIP(GNU Zip)
2,compress(UNIX系统的标准压缩)
3,deflate(zlib)
4,identity(不进行编码)
在HTTP通信过程中,请求的编码实体资源未全部传输完成之前,浏览器无法显示请求页面。但传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码。使用分块传输编码的实体主体由接受的客户端负责解码,恢复编码前的实体主体。
发送邮件时,我们可以在邮件里写入文字并添加多份附件,这可以采用MIME(多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。
HTTP协议中也采纳了多部分对象集合,发送的一份报文主体可含有多类型实体。通过是在图片或文本文件等上传时使用。但是用户在下载过程中会出现图片或文件下载过程中断的情况,需要重新开始,因此这其中需要一种可恢复的机制,即指能从之前下载中断处恢复下载。要实现这种功能需要指定下载的实体范围,这种指定范围发送的请求叫做范围请求。
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供給客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。包含在请求报文中的某些首部字段就是判断的基准。
1,Accept
2,Accept-Charset
3,Accept-Encoding
4,Accept-Language
5,Content-Language
内容协商技术可以有以下3种类型:
1,服务器驱动协商,即由服务器端进行内容协商。以请求的首部字段为参考,服务器端会自动处理。
2,客户端驱动协商,即由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还有利用JavaScript脚本在Web页面上自动进行选择。
3,透明协商,即服务器驱动和客户端驱动的结合体。
二,返回结果的HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果,标记服务器端的处理是否正常,通知出现的错误等工作。
状态码的类别主要有以下几种:
HTTP状态码种类繁多,简述下列几种常见的状态码:
2XX的响应结果表明请求被正常处理了。
1,200 OK
表示从客户端发来的请求在服务器端被正常处理了。注意的是,在响应报文内,随状态码一起返回的信息回因方法的不同而发生改变。
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
该状态码表示客户端进行了范围请求,服务器也成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
1,301 Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。但是与301状态码不同的是已移动的资源对应的URI将来还有可能发生改变。
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304被划分在3XX类别中,但和重定向没有关系。
临时重定向。该状态码和302 Found有着相同的含义。尽管302标准禁止POST改为GET,但实际使用时大家并不遵守。但是307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同情况。
4XX的响应结果表明客户端是发生错误的原因所在。
1,400 Bad Request
该状态码表示请求报文中存在语法错误。
2,401 Unauthorized
该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外,若之前已进行过一次请求,则表示拥护认证失败。返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
该状态码表示对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但是如果想作说明,可以在实体的主体部分对原因进行详述。
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端被拒绝请求且不想说明理由时使用。
5XX的响应结果表明服务器本身发生错误。
1,500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的Bug或某些临时的故障。
2,503 Service Unavailable
该状态码表明服务器临时处于超负载货正在进行停机维护,现在无法处理请求。如果事先得知解除以上状态需要的时间,最好写入Retry-After首部字段再返回給客户端。
最后要注意的是,有可能出现状态码和状态的不一致。即不少返回的状态码响应都是错误的,但是不用难以察觉。比如Web应用程序内部发生错误,状态码依旧返回200 OK。