更多详细内容请看W3C/HTTP1.1官方文档,英文原文地址
HTTP协议
主要特点
支持客户/服务器模型(C/S)
灵活
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题)
无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息。(使用cookie机制可以保持session,解决无状态的问题)
HTTP请求
一个从客户端到服务器的请求消息包括一行请求消息,方法,资源标识,协议版本。
Request
= Request-Line Section 5.1
*(( general-header
| request-header
| entity-header ) CRLF)
CRLF
[ message-body ]
请求行(Request-Line)
请求行以方法(Method)开头,后面跟着请求统计资源定位地址(Request-URI).方法是大小写敏感的。
方法
Method = "OPTIONS"
| "GET"
| "HEAD"
| "POST"
| "PUT"
| "DELETE"
|"TRACE"
|"CONNECT"|extension-method
这个列表中的方法在Allow
头部域中被指定允许。服务器响应的返回码总是会通知客户端请求资源是否在当前方法是否被允许,因为被允许的方法集是会动态改变的。如果服务器理解但对请求资源方法不被允许,服务器会返回405,如果服务器无法识别方法,会返回501(没有实现).GET
和HEAD
方法必须被所有普通的服务器支持,其他方法是可选的。如果要实现上述方法,就必须使用相同的语义实现。
请求URI
请求URI是统一的资源标识符,在请求上标识资源。
Request-URI = "*" | absoluteURI | abs_path | authority
Request-URI的四个选项依赖于请求的性质。星号”*”意思是除了服务器自己之外,请求不支持特定的资源,并且只有当方法没有应用于特定的资源下才可被使用。一个简单的例子如下:
OPTIONS * HTTP/1.1
这绝对地址(absoluteURI)是必要的当向代理提交请求时,代理可能会要求再次转发或从一个有效的缓存里构造响应请求。
请求资源的识别(The Resource Identified by a Request)
请求资源的精确定位是由请求里的Request-URI和Host头域决定的。
如果源服务器不允许资源根据请求的不同主机来区分时,那么它会忽略Host头域的值,当它决定通过HTTP/1.1请求来识别资源时。
请求头域 Request Header Fields
请求头域允许客户端传递关于请求和客户端的附加的信息给服务器。这些头域作为请求的修饰,这和程序语言方法调用的参数语义是等价的。
request-header = Accept
| Accept-Charset
| Accept-Encoding
| Accept-Language
| Authorization
| Expect
| From
| Host
| IF-Match
| IF-Modified-Since
| IF-Range
| IF-Unmodified-Since
| IF-None-Match
| Max-Forwards
| Proxy-Authorization
| Range
| Referer
| TE
| User-Agent
请求数据
使用GET方法访问某网站,则HTTP请求报文为:
GET /index.html HTTP/1.1 \r\n
Host: www.gduf.edu.cn \r\n
User-Agent:Mozilla/5.0 \r\n
Accept-Language:cn */* \r\n
HTTP响应
接收到请求消息并解析后,服务器就会发送一个HTTP响应消息。
状态行
响应(Response)消息的第一行是是状态行,其内容包括协议版本、数值型状态码、原因文本描述。格式如下:
结果码和原因描述
结果码(Status-Code)是一个3位的整数,一般在程序中使用。原因描述(Resion-Phrase)是结果码的文本解释,是给人类用户看的。结果码的第一位数字是HTTP响应的分类码,后面两位数字表述大分类下的具体结果。第一位数字有1到5共5个值,分类如下:
- 1xx: 信息-请求已接收,继续处理
- 2xx: 成功- 信息已经收到,理解并接受
- 3xx: 重定向-为了完成请求必须采取进一步动作
- 4xx: 客户端错误-请求包含错误语法或无法被满足
-5xx: 服务器错误-服务器无法完成一个显然有效的请求
常见的状态码
200 OK :客户端请求成功
300 Multiple Choices: 针对请求,服务器可执行多种操作。
301 Moved Permanently:永久移动,请求网页已永久移动到新位置
302 Found
303 See Other:查看其他位置,请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码
307 Temporary Redirect:临时重定向,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置进行以后的请求
400 Bad Request: 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized: 请求未经授权
403 Forbidden: 服务器收到请求,但是拒绝提供服务
404 Not Found: 请求资源不存在
500 Internal Server Error: 服务器发生不可预期错误
503 Server Unavaliable: 服务器当前不能处理客户端请求,一段时间后可能恢复正常