本文是对这几天学习Http协议的基础知识的小结。内容包括了Http协议的原理,Http请求信息和Http响应信息以及Http协议状态码等内容。
1、Http协议的基本原理:有客户端向服务器发送请求,服务端对请求处理,对客户端进行相应。如下图所示。
图1 Http协议原理图
下面给出一个简单的请求和响应的示例代码:
客户端请求:
GET / HTTP/1.1 Host: localhostAccept: text/htmlAccept-Language: en-usAccept-Encoding: gzip,deflateConnection: keep-alive空行(CR+LF)
服务端响应:
HTTP/1.1 200 OK Date: Fri, 13 Jul 2012 02:45:30 GMTServer: ApacheLast-Modified: Fri ,31 Agu 2007 02:02:20 GMTETag: "45bae1-16a-46d776ac"Connection: closeContent-Type: text/htmlContent-Length:362空行(CR+LF)<html> <head></head><body>.... --Content 362Bytes.... </body></html>
2、Http请求
a.请求报文格式:
----------------------------------------------------------
请求行 ↔ GET / HTTP/1.1
请求头信息 ↔ Host: localhost
...
...
...
空行(CR+LF)
[请求主体信息](可以没有)
-----------------------------------------------------------
b.说明:
→请求行:请求方法+请求路径+Http协议版本
请求方法:GET,POST,HEAD,OPTION,DELETE,PUT等
请求路径: /
Http协议版本:HTTP/0.9 HTTP/1.0 HTTP/1.1
→请求头信息
Host: 请求的主机名称 (localhost)
注意:Host字段信息必须被包含在请求头信息中,因为同一个IP地址下可能会有多个虚拟主机,
需要Host来指定请求的是该IP下的哪一个主机。
Accept: 客户端可以处理的文件类型。 (text/html,text/plain,image/jpeg)
Accept-Encoding: 用户代理支持的内容编码及优先级顺序 (gzip,deflate,compress)
Accept-Charset: 用户代理支持的字符集及优先级顺序 (iso-8859-5)
Referer: 告知服务器请求的原始资源的URI (用此字段可以进行反防盗链)
例如:Referer:http://www.baidu.com
User-Agent: 传达创建请求的浏览器和用户代理名称等信息
3、Http响应
a.响应报文格式
-------------------------------------------------
响应行 ↔ HTTP/1.1 200 OK
响应头信息 ↔ Server:Apache
...
...
...
空行(CR+LF)
[响应主体信息](可以没有)
--------------------------------------------------
b.说明:
→响应行:Http协议版本+状态码+状态字
Http协议:HTTP/0.9,HTTP/1.0,HTTP/1.1
状态码:
状态码 说明
1XX 信息性状态码。接收的请求正在处理
2XX 成功状态码。请求正常处理完毕
3XX 重定向状态码。需要进行附加操作以完成请求
4XX 客户端错误状态码。服务器无法处理请求
5XX 服务器错误状态码。服务器处理请求出错
一些重要的状态码:
2XX:200 204 206
200(OK) → 客户端的请求在服务端被正常处理
204(No Content) → 服务器接收请求成功处理,但在返回响应报文中不含实体的主体部分
206(Partial Content) → 客户端执行了范围请求,而服务器成功执行了这部分的GET请求
3XX:301 302 303 304 307
301(Moved Permanently) → 永久重定向。表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI
302( Found) → 临时重定向。表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的 URI访问
303(See Other) → 表示由于请求对应的资源存在着另一个URI,应使用 GET方法定向获取请求的资源
304(Not Modified) → 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
304状态码返回时,不包含任何响应的主体部分
307(Temporary Redirect) → 临时重定向。与302有着相同的含义,但是302会将POST变换成GET,而307不会将POST变换成GET
4XX:400 401 403 404
400(Bad Request) → 表示请求的报文中存在语法错误
401(Unauthorized) → 表示发送的请求需要通HTTP认证的认证信息,若之前已经进行过一次请求,这表示用户认证失败
403(Forbidden) → 表明对请求资源的访问被服务器拒绝
404(Not Found) → 表名在服务器上无法找到请求的资源
5XX:500 503
500(Internal Server Error) → 表明服务器端执行请求时发生了错误。也有可能是Web应用存在bug或某些临时的故障
503(Service Unavailable) → 表明服务器暂时处于超负载或正在进行停机维护,现在无法执行请求
→响应头信息
Age: 告知客户端源服务端在多久前创建了响应(字段单位为:秒)
若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。
代理创建响应时必须加上首部字段Age
ETag: 告知客户端响应实体信息的标记,将资源唯一标识,
ETag由服务器分配,没有统一的算法规则
Location:将接收方引导至另一个资源所在处
Server: 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。不单单会标出服务器上的软件应用名称,
还有可能包括版本号和安装时启用的可选项
4、实体首部字段(请求头信息或者响应头信息的字段)
Content-Encoding: 对实体的主体部分选用的内容编码方式
Content-Language:告知客户端主体信息使用的语言
Content-Length: 说明主体信息的大小(字节)
Content-Type: 说明主体信息的文件(媒体)类型
Set-Cookie: 服务端向客户端写Cookie内容信息
Cookie: 客户端向服务器发送Cookie内容信息
附:以上内容参考自《图解HTTP》一书。