在这里,&分隔不同的键值对,=表示键和值得关系。可以看到一共有四个键值对关系,它们是:

k1: v1

k2: v2

k3: 空字符串

k4: 起码该键被定义了

一般来说,键值对要写成k=v的形式,但是k=和仅仅一个k都是允许的,前者表示键k的值是空字符串,后者表示键k被定义了,但是其值是什么并不关心。

从上面的例子中发现,在query-string中&和=被用于特殊的用途了,我们不能再在其中从容地使用这两个符号了。如果我们要在值中包含这两个符号,那咋办呢?方法就是,编码。

在实际的HTTP请求中,对于如下的键值关系

k1: &
k2: =

具体的query-string要写成:

k1=%26&k2=%3D

这是因为在ASCII编码中,&的16进制表示是26,=的16进制表示是3D。对于需要的编码,就要表示成其实际编码的16进制表示,每个字节都用一个%XX三个字符进行表示。这样,%本身也就要进行编码了,它的编码是%25。除了这些控制字符的编码,还可以进行中文等非英语语言的编码。

HTTP请求头

HTTP请求头格式与之前所说的消息头格式没什么两样,就是以冒号分隔的键值对。HTTP请求头中,既包含预定义的头(如Content-Type、Content-Length等),也支持自定义头。原本打算多列出几个常见的请求头的,但限于精力,不打算这样做了。我只说说我最常用的Content-Type头吧。

Content-Type头,既可用于请求消息,也可用于响应消息,是规定请求正文内容格式的头部。例如利用这个头部,我们可以规定正文的格式为纯文本格式、表单格式、XML格式、JSON格式、图像格式等。例如Content-Type: application/json就表示JSON文本格式。

HTTP响应

HTTP响应消息的基本格式也是一样的,包含三个部分:

响应行

响应头部

响应正文

响应头部和响应正文我觉得不需要再多说了。响应行的基本格式是:

版本号 状态码 状态文本

例如下面的响应行:

HTTP/1.1 200 OK

其对应关系为:

版本号:HTTP/1.1

状态码:200

状态文本:OK

HTTP状态码主要表示应答的状态。状态码是由3个数字表示,其中第一个数字表示一个大状态,后面两个数字表示该大状态的一个子状态。200就表示操作成功,还有其他常见的如404表示对象未找到,500表示服务器错误,403表示不能浏览目录等等。

状态码一共分为五个大状态,它们是:

1xx

2xx:请求成功处理

3xx

4xx:客户端出错

5xx:服务器出错

HTTP协议示例:

接下来的所有示例中,我们将代码都写成前面的一行一行的模式,但略去. 这时只要记住每行的结尾都暗含一个CRLF控制就可以了。例如:

GET /simple.html?bg=white HTTP/1.1
Accept: text/html
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: localhost:8080
Connection: Keep-Alive

GET请求没有请求正文,但可以包含query-string.

POST请求可以包含请求正文,例如下面带JSON格式正文的POST请求:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
Content-Type: application/json
Content-Length: 38
{"name1": "value1", "name2": "value2"}

一个返回404错误的响应示例:

HTTP/1.1 404 Not Found
Date: Mon, 06 Mar 2006 09:03:14 GMT
Server: Apache/2.0.55 (Unix) PHP/5.0.5
Content-Length: 291
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"
 <html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /notexist was not found on this server.</p>
<hr>
<address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address>
</body></html>




相关内容