HTTP协议采用了非常简单的请求-响应模式。由浏览器向网站发出请求(称为http request),网站根据请求将相关的资源返回给浏览器(称为http response)。这样周而复始就形成了网络通信。
HTTP协议是无状态的,也就是说同一个客户端的这次请求和上次请求是独立的,对http服务器来说,它并不知道这两个请求来自同一个客户端。为了解决这个问题,在HTTP中通过Session和Cookie机制来维护状态。
HTTP 请求(http request)
消息的结构
HTTP消息可分为三部分,第一部分叫request line
(请求行), 第二部分叫http header
, 第三部分是body
。下面通过一个例子解释
1 | # 第一部分:request line |
从上面的例子可以看到:
request line 可分为三部分,分别是请求方法 请求资源 使用的协议
,上面的例子中,请求的方法是GET,请求的资源是http://www.google.com/
,使用的HTTP协议是1.1版本的,也有1.0版本的HTTP协议,主要区别在于1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度。
http header 是格式为key:value
的一系列kv对,这些kv对主要作用是告知服务器关于浏览器的一些基本信息,如请求的host、使用的终端类型、页面缓存情况等。具体作用要根据具体的kv对分析
body 是发送给服务器的query信息 当使用的是”GET” 方法的时候,body是为空的(GET只能读取服务器上的信息,post能写入)
上面提到的三部分通过换行符\r\n
,其中request line
永远都是占第一行,接下来每个header一行一个,换行符是\r\n
,当遇到连续两个\r\n
时,Header部分结束,后面的数据全部是Body
请求的方法
上面提到的request line的最后一个部分为请求的方法,在HTTP中请求的方法最基本的有4种,分别是GET,POST,PUT,DELETE
。 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE 就对应着对这个资源的查,改,增,删4个操作。
我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
GET方法和POST方法的区别如下:
GET 提交的数据会放在URL之后,以
?
分割URL和传输数据,参数之间以&
相连,如EditPosts.aspx?name=test1&id=123456
。POST 方法是把提交的数据放在HTTP包的Body中。GET 提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET 方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
HTTP 响应(http response)
消息的结构
HTTP也分为三部分,第一部分叫response line
, 第二部分叫response header
,第三部分是body
。下面是对应着上面的请求的一个响应
1 | # 第一部分:response line |
从上面的例子可以看到:
response line可以分为两部分,分别是使用的HTTP协议,状态码及其含义。在上面的例子中使用的协议版本为1.1,状态码为302,表示重定向,也就是会向response中的location表示的url发出新的请求。
response header也是格式为key:value
的一系列kv对,表示服务器的状态和返回的内容的一些信息:如Content-Type
表明返回的内容的类型,该类型也决定了body的内容,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据;Content-Length
表明返回的内容的类型;Content-Encoding
表示,Body数据是被压缩的,最常见的压缩方式是gzip,如content-Encoding: gzip
,压缩的目的在于减少Body的大小,加快网络传输。
body 则是返回给浏览器的实际内容,由content决定其类型。如上面的例子中返回的类型是text\html
,则body的内容是该网页的html代码。如果该html代码中还有其他的资源如图片等,浏览器会发送一个新的http请求来获取这个资源。
状态码
response line中的状态码表示对浏览器的请求的回应状况,状态码由三位数字组成,第一个数字定义了响应的类别其中
- 1XX 提示信息 - 表示请求已被成功接收,继续处理
- 2XX 成功 - 表示请求已被成功接收,理解,接受
- 3XX 重定向 - 要完成请求必须进行更进一步的处理
- 4XX 客户端错误 - 请求有语法错误或请求无法实现
- 5XX 服务器端错误 - 服务器未能实现合法的请求
一些常见的状态码及其含义如下所示:
- 200 OK
请求被成功地完成,所请求的资源发送回客户端 - 302 Found
重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request - 304 Not Modified
文档已经被缓存,直接从缓存调用 - 400 Bad Request
客户端请求与语法错误,不能被服务器所理解 - 403 Forbidden
服务器收到请求,但是拒绝提供服务 - 404 Not Found
请求资源不存在 - 500 Internal Server Error
服务器发生了不可预期的错误 - 503 Server Unavailable
服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更多状态码详细解释见http://tool.oschina.net/commons?type=5