HTTP网络协议必知必会大盘点(1)(2)
在这里,&分隔不同的键值对,=表示键和值得关系。可以看到一共有四个键值对关系,它们是:
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>
评论暂时关闭