15.5 项目:网页投票器�D�DHTTP客户端
在互联网时代,很多服务程序采用了超文本传输协议
HTTP
进行报文传输,比如中国联合通信公司短消息网关系统接口协议中就提供了
HTTP
报文的接口协议,甚至有很多信息系统只支持
HTTP
模式的接口报文,比如在某些企信通接入网关等。因此在
Unix
下开发的
C
程序,就很有必要具备
HTTP
报文的组包、发送和接收功能。
读者们应该有过网上投票的经历,很多网站的投票是不限制
IP
的,因此为了获取一个靠前的排名,不少人在不辞辛劳的点击鼠标,当然也有部分所谓的“聪明人”选择使用投票软件或者网页刷新器。初次接触自动投票工具的用户很可能会惊叹于这些工具强大的投票功能,其实这些软件本质上就是一个
HTTP
客户端,它们编辑选手信息成
URL
并向网页服务器发送读取某个网页的请求,服务器接收请求执行该网页,该网页则自动为编辑的选手加票。
15.5.1 URL(Uniform Resource Locator,统一资源定位符)
URL
就是我们在浏览器的地址栏里输入的网站地址,浏览器通过
HTTP
将
Web
服务器上站点的网页代码提取出来,并翻译成漂亮的网页。
URL
中可以指定
WEB
站点名称、网页名称,也可以向访问的网页提交不同的参数,
WEB
端的投票服务程序正是利用了
URL
中的参数达到了区分选手并为选手加票的目的,比如以下
URL
就是一个投票的例子:
http://www.zhiliaowang.com/toupiaoceshi.asp?name=zyx
其中:
(1)
“
http://
”代表超文本传输协议,通知网页浏览器(如
IE
等)显示
Web
页,通常不用输入。
(2)
“
www.zhiliaowang.com
”是装有网页的服务器的域名,或站点服务器的名称。
(3)
“
/toupiaoceshi.asp
”
是服务器端的投票服务程序的绝对路径的名称,“
/
”为根目录
。
(4)
“
?
”
代表后面接着参数。
(5)
“
name= zyx
”标识了一个参数
name
,它的值是“
zyx
”。在投票服务程序中,选手的姓名或编号等信息一般通过参数传入,不同的投票服务程序的参数的设置都不一样,读者要根
据具体情况具体分析
,本处
URL
的含义是为
姓名叫“
zyx
”的选手投票。
15.5.2 HTTP协议报文格式
接下来我们看看
HTTP
协议(
Hypertext
Transfer
Protocol
�D�D超文本传输协议)浏览器端(客户端)向
WEB
服务器端访问页面的过程和
HTTP
协议报文的格式。
基于
HTTP
协议的客户机访问包括
4
个过程,分别是建立
TCP
套接字连接、发送
HTTP
请求报文、接收
HTTP
应答报文和关闭
TCP
套接字连接:
1. 创建TCP套接字连接
客户端与
WEB
服务器创建
TCP
套接字连接,其中
WEB
端服务器的地址可以通过域名解析确定,
WEB
端的套接字侦听端口一般是
80
。
2. 发送HTTP请求报文
客户端向
WEB
服务端发送请求报文,
HTTP
协议的请求报文格式为:
请求消息
=
请求行(实体头信息)
CRLF[
实体内容
]
请求行
=
方法
URL
HTTP
版本号
CRLF
方法
= GET|HEAD|POST|
扩展方法
URL =
协议名称
+
宿主名
+
目录与文件名
其中“
CRLF
”表示回车换行。
“请求行”中的“方法”描述了对指定资源执行的动作,常用的方法“
GET
”、“
HEAD
”和“
POST
”等
3
种,它们的含义如表
15-8
所示:
表
15-8 HTTP
请求方法
取值
|
描述
|
GET
|
从
WEB
服务器中获取对象,不同类型的对象将获取不同的信息,比如:
・
文件类型对象,获取该文件的内容。
・
程序类型对象,获取该程序执行的结果。
・
数据库查询类型对象,获取该查询的结果。
|
HEAD
|
要求服务器查找对象的元信息。
|
POST
|
从客户端向
WEB
服务器发送数据。
|
“实体头信息”中记载了报文的属性,利用这些信息可以实现客户端与
WEB
服务器之间的请求或应答,它包括报文的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等信息。
实体内容是报文传送的附加信息,一般供
POST
请求填写。
GET请求报文例子
一个
URL
为“
http://www.zhiliaowang.com/toupiaoceshi.asp?name=
朱云翔”的
GET
请求报文例子如下:
GET http://www.zhiliaowang.com/toupiaoceshi.asp?name=
朱云翔
HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: www.zhiliaowang.com
Connection: Keep-Alive
其中
“
/toupiaoceshi.asp?name=
朱云翔
”
是
URL
信息
,
语句
“
ACCEPT
:
*/*
”
及其后的语句是
“
实体头信息
”
。
注意
:
在语句
“
Connection
:
Keep-Alive
”
下的空行是必须的。
POST请求报文例子
下面是
HTTP
协议中关于
POST
请求报文例子,节自《中国联合通信公司短消息网关系统接口协议
(SGIP)
》
V1.2
版:
POST /sp.cgi HTTP/1.0 /*
请求行
,
服务程序为
sp.cgi */
Host: www.spserver.com /*
以下为实体头信息
*/
Authorization: Basic <Base64
串
>
Content-Length: <Content-Length>
<CommandId>=<4> /*
以下为
POST
请求的实体信息
*/
<SequenceNumber>=<205502327125025327> /*
实体部分输送报文
*/
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=<ABCD 1234>
一般情况下,采用
POST
报文传送信息的数据存储在“实体”部分中。
3. 接收HTTP应答报文
WEB
服务器处理客户请求
,
并向客户机发送应答报文
,
HTTP
协议的应答报文格式为
:
应答报文
=
状态行(实体头信息)
CRLF [
实体内容
]
状态行
= HTTP
版本号 状态码 原因叙述
状态码描述了
WEB
服务器执行客户机请求的状态信息,其取值含义如表
15-8
所示:
表
15-8 HTTP
应答响应码含义
取值
|
描述
|
1××
|
保留。
|
2××
|
成功接收,比如“
200
”表示处理成功。
|
3××
|
客户需进一步细化请求。
|
4××
|
客户错误,比如“
404
”表示访问的指定资源不存在。
|
5××
|
服务器错误。
|
GET应答报文例子
一个请求
URL
为“
http://www.zhiliaowang.com/toupiaoceshi.asp?name=
朱云翔”的应答报文例子如下:
HTTP/1.1 200 OK
Connection: keep-alive
Date: Thu, 26 Jul 2007 14:00:02 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 190
Content-Type: text/html
Set-Cookie: ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB; path=/
Cache-control: private
<html>
<head>
<title>
精通
Unix
下
C
语言编程
</title>
</head>
<body>
<b>
精通
Unix
下
C
语言编程与项目实战
<br></b>
<b>
投票测试
<br></b>
感谢你为选手
朱云翔
投票
!
</body>
</html>
语句
“
HTTP/1.1 200 OK
”
中
,“
200
”
是响应码
,“
OK
”
是原因描述。
POST应答报文例子
下面是
HTTP
协议中关于
POST
应答报文例子,节自《中国联合通信公司短消息网关系统接口协议
(SGIP)
》
V1.2
版:
HTTP/1.0 200 OK /*
状态行
,
应答成功
*/
Date: Tue, 13 Mar 2001 02:45:12 GMT /*
以下为实体头信息
*/
Server: Apache/1.3.12 (Unix)
Content-Type: text/html
Connection: close
<CommandId>=<80000004> /*
以下为
POST
应答的实体信息
*/
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=< EFGH 5678> <Result>=<0>
一般情况下,
POST
应答报文的“实体”部分存储实际传输的信息。
4. 关闭TCP套接字连接
客户机与服务器双方关闭套接字连接
,
结束
TCP/IP
对话。