Http介绍
Http协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器与本地浏览器之间传递超文本的协议。
Http协议永远都是客户端发起请求,服务器回送响应。见下图:
所以Http分Http请求和Http响应。
http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态.
Url
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下
schema://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定低层使用的协议(例如:http, https, ftp)
host HTTP服务器的IP地址或者域名
port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080/
path 访问资源的路径
query-string 发送给http服务器的数据,即我们常使用的参数
anchor 锚
URI是指Url中 /path/…… 这段地址,资源的路径
Http Request
打开网页需要多次Request,因为HTML中引用的css,js,image等文件也需要Request,等所有文件加载完成,才能呈现整个网页。当设置了缓存以后,第二次访问时,css,js等文件就会从缓存中读取,不需要再次向服务器发送Request.
Request分为: Request line, Request header, Request body.
Request Line
格式为:Method Request-URI HTTP-Version
Request Method(请求方式)有:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
常用的是Get,Post。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
Get与Post的区别
1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
Request Header
主要是携带客户端浏览器的信息给服务器,所以其中很多字段是用来描述浏览器信息。
请求头详解:(下面字段并非必须的,看情况)
Accept: 用于告诉服务器,客户机所支持的数据类型
Accept-Charset: 用于告诉服务器,客户机所采用的码表
Accept-Encoding: 用于告诉服务器,客户机所支持的数据压缩格式
Accept-Language: 用于告诉服务器,客户机的语言环境
Host: 用于告诉服务器,客户机想访问服务器哪台主机
If-Modified-Since: 用于告诉服务器,客户机对于资源的最后缓存时间,精确到秒级。
Referer: 用于告诉服务器,客户机是从哪个页面去访问服务器的 (防盗链)
User-Agent: 用于告诉服务器,客户机的机器环境(所使用的操作系统,浏览器版本号)
Cookie:客户端通过这个头字段,可以带一些数据给服务器
Connection:客户端通过这个头字段告诉服务器,请求完成后,是保持链接还是关闭链接。一般情况下服务器处理完客户的请求,并收到客户的应答后,即断开连接。但是当设置为Keep-Alive时,是不会断开TCP链接的。If-None-Match:和ETag一起工作,工作原理是在HTTP Response中添加ETag信息
If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中.
这是请求百度的Request的例子:
Http Response
组成部分和Request类似。
Response Line
状态行格式为:HTTP-VersionStatus-Code Reason-Phrase
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200OK //客户端请求成功
400Bad Request //客户端请求有语法错误,不能被服务器所理解
401Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403Forbidden //服务器收到请求,但是拒绝提供服务
404Not Found //请求资源不存在,eg:输入了错误的URL
500Internal Server Error //服务器发生不可预期的错误
503Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Response Header
消息报头的字段如下:
Set-cookie:用于把cookie 发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie.
Location:这个头通常配合302状态码使用,服务器使用这个头告诉浏览器去找谁
Server:服务器通过这个头告诉浏览器,服务器的类型
Content-Encoding: 服务器通过这个头告诉浏览器,数据的压缩格式(gzip) 一定要压缩服务器返回数据,既可提升服务器性能,又可大大减少服务器网络流量费用
Content-Length:服务器通过这个头告诉浏览器,回送数据的长度
Content-Language: 服务器通过这个头告诉浏览器,回送数据的语言
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型,对于响应返回图片、视频、音频等数据类型时,很重要。
Last-Modified: 服务器通过这个头告诉浏览器,数据的最后修改时间,精确到秒级。
Refresh:服务器 告诉浏览器,多长时间定时刷新或定时转向其他页面 (论坛刷新)
Content-Disposition: 控制浏览器以下载方式打开回送的数据,对于响应返回图片、视频、音频等数据类型时,可能会用到。
P3P: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
Transfer-Encoding: 服务器通过这个头告诉浏览器,数据是以块方式回送的(用的少)
Expires:控制浏览器缓存数据的时间(-1或0,代表控制浏览器不要缓存) 时间+数据:保存该数据缓存的时间,eg:2012 12 12 (1.html)
Cache-Control: no-cache
Pragma: no-cache
以上三个头一起用,就可以控制所有的浏览器不要缓存数据
ETag:缓存相关,服务器给每一个网页都生成一个编码,用来进行比对,以配合304或307通知浏览器是否使用缓存的数据,精确到毫秒级。和If-None-Match 配合使用(一般的服务器不需要这么严谨)
访问百度的响应报头:
HttpWatch
前面的截图都来自于HttpWatch Professional工具,是IE中的插件,还有很多Http抓取的工具,这个工具用法很简单,自行下载后,在工具中选择HttpWatch Professional.
在请求前,点击 Record就可以捕获Http的请求与响应报头。
原文:http://blog.csdn.net/aacm1992/article/details/19330729