Silver的博客
掌声背后
日志
HTTP基础实用教程
本教程更倾向于实际应用,但事实上并不全面,学习时要求您广泛地查阅相关资料(单击文章中连接即可 ^_^),故本文
主要起引导作用
,引导您一步一步学习HTTP协议。
本文主要以客户端的角度来讲解HTTP协议,那些HTTP历史、优点什么的就不介绍了,要看的话网上多的得很。仅供有兴趣者者参考使用,如有不足错误之处,请于下栏“评论”处指出。 注意,你应该要会一门编程语言,用于操作练习。如不会,建议下载文末的 小工具。 好,进入正题。HTTP协议基于 TCP连接(也就是一个 客户端,一个 服务器,客户端主动连接服务器):先有客户端(浏览器)连接上服务器(网站),然后客户端会发送一个 数据包(即 HTTP请求包),告诉服务器想要什么。服务器接收到这个数据包后对其进行分析或,将 相应的数据( HTTP应答包,通常为网页内容)回发给客户端。最后,客户端或服务器断开连接,这就完事了。很简单吧? 一、连接服务器刚刚说了,如果你要获取某个网站的某个网页,就要先连接该网站服务器 (废话... -_-||)。例如要访问 http://www.google.cn/language_tools,那只要连接到 www.google.cn 即可,端口号默认为80。如遇到类似这样格式的网址:http://xxx.cn:10728/,那就要连接 xxx.cn,端口10728(冒号“:”后的数字即为端口号)。二、发送HTTP请求包HTTP请求包
GET /language_tools HTTP/1.1[换行符]
Host: www.google.com [换行符] Accept-Language: zh-cn [换行符] [换行符] 第一行为请求行,由三部分组成: 第一个单词(“ GET”),叫做“ 请求方法”,GET的中文意思是“获取,获得”,即获取网页。(除GET外,还有 POST、HEAD、OPTIONS、PUT、DELETE、TRACE,共七种方法。GET和POST最为常用。)注意,必须大写! 第二个“ /language_tools”,即要取得的网页。如是首页,则为“/”即可。 第三个“ HTTP/1.1”是协议名称(HTTP)和 协议版本(1.1),这些是固定的。 请求行后就是“ 请求头”。从例子里就可以看出,请求头的结构为“名称: 内容”。这些请求头每个之间用换行隔开,不分顺序。 例子中第一个是“ HOST”(中文意思“主机”),内容为服务器域名(或IP),因为许多服务器通常有绑定多个域名,这样就必须告诉服务器你访问的是那个域名。 第二个“Accept-Language”(中文意思“接受的语言”),当这个网页可能有很多个语言版本时,用此告诉服务器,用什么语言(zh-cn 为简体中文的 语言代码)。 除此之外,常用的还有Cookie、 Connection、 Content-Length等等,这里不再累述,请 自行Google。 最后,别忘了带上一个空行。空行何用?事实上,这个请求包是可以分几次发送的(如果比较长的话),这个空行可以让服务器知道这个请求包已经结束。 三、解读HTTP应答包HTTP答应包
HTTP/1.1
200 OK
[换行符]
Cache-Control: private, max-age=0 [换行符] Date: Wed, 21 Jan 2009 08:17:40 GMT [换行符] Content-Type: text/html; charset=GB2312 [换行符] Set-Cookie: PREF=ID=ae1601bed998d1b2…… [换行符] Server: gws [换行符] Transfer-Encoding: chunked [换行符] [换行符] <html><head><title>语言工具</title><meta http-equiv="content-type" content="text/html;charset=GB2312"><style>…… [换行符] [换行符] 在答应包中,第一行叫“ 状态行”,第一个协议名和版本,没啥好讲的。 第二个是 状态码,由三个数字组成, 200代表“成功、一切正常”。常见的还有 500(服务器内部错误)、 404(文件未找到)等等,详请见 维基百科。附: 漫画图解4xx错误 状态码后是文字描述,与状态码对应。没问题就“ok”,有问题就写上问题的简单描述。 接下来就是“ 应答头”了,与请求头类似,介绍几个常用的。Data是服务器时间、Set-Cookie设置小甜饼,下次发送请求包时应带上它。其他的请自行Google。 最后就是最重要的“ 请求正文 ”了,也就是网页的内容。 例子中为Google语言工具的HTML代码。和答应头之间用一个空行隔开,以一个空行结束。 需要注意的是,由于网页内容较多,应答包通常要分N次发送,客户端分析时需将其自行整合。 四、PSOT请求刚刚一路讲的都是GET,其实还有一个非常常用的请求方法——POST。POST用于提交表单,若有学过ASP、PHP之类的,就一定知道“ 表单”为何物。也就是我们登录网站、注册用户、投票、发帖子等填写的那些项目。当你单击“登录”、“注册”、“提交”等按钮时,这些表单中的内容就被提交到了服务器。提交这些数据,通常采用的就是POST!POST请求包
POST /test/test.asp HTTP/1.1
[换行符]
From: local [换行符] Content-Length: 26 [换行符] [换行符] user=bbtx&password=qqq1243 [换行符] 与刚才的GET包相比,请求方法由“GET”变成了“POST” (又是废话...)。 请求头方面,“Content-Length”是必须的,表示数据的长度,也就是末尾黄色部分的长度。因为服务器如果不知道长度,怎么知道你(客户端)什么时候发送完了所有数据呢?如果没有带上此头,服务器通常会返回错误码 411。 那黄色部分也就是实际的数据内容了,假设这是一个登录页面的POST。这个登录页面 就像这样,有两个文本域,名称分别为user(用户名)和password(密码)。 当输入用户名为“ bbtx”,密码为“ qqq1243”,提交的数据即为“ user=bbtx&password=qqq1243”。也就是“ 名称=内容&名称=内容&……”的形式。 要注意的是,中文通常会编码为类似“ %B0%E6%C8%A8%CB%F9%D3%D0+%D0%BB%B6%FB%B3%C0”的形式,这是中文被转换成了十六进制值。服务器需要对其进行解码后方可阅读。 |
引文来源 HTTP基础实用教程 ?(BBTX 原创空间)?