手记

Http协议基础知识的点点滴滴

HTTP协议

HTTP协议作为网络传输的基本协议,有着广泛的应用。HTTP协议的完整内容很多,但是其核心知识却又简单精炼。

HTTP协议:消息的分类

  • 请求消息
  • 响应消息

    HTTP协议:特点

  • 无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
  • 无状态: 指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    HTTP协议:消息的基本格式

  • 首行
  • 头部(header)
  • 正文(body)

==头部==用来指出HTTP消息的一些属性,它们有固定的格式;==正文==部分是传输的实际内容,它们的格式是任意的,通常用Content-Type头来指定。==首行==在请求消息和响应消息中具体格式略有区别,它们表示的按理说应该是HTTP消息最基本的部分。不论是HTTP请求还是HTTP响应,首行都是有的,否则会出现不可饶恕的解析错误;然而头部和正文是可选的,不过实际过程中,多多少少都要包含一些基本的头。

首行和头部都是以==ASCII==编码,正文部分的编码任意了。在实际的开发中,发送的文本消息时常会碰到乱码的问题。通常约定以UTF-8格式进行编码和解码。

HTTP消息是基于TCP协议的上层应用协议。TCP协议是网络流协议的一种。抽象地讲,就是从一台主机一个字节一个字节有序地传输到另一台主机。对于HTTP协议来说,自然保持了这种有序性,即按照首行、头部、正文的顺序进行传输。首行和头部都是ASCII文本流,正文部分是字节流。一个特殊的控制结构CRLF用来控制每个部分的结束。

CRLF是回车符和换行符的意思,它们是两个特殊的ASCII字符。CR是回车符(\r),在ASCII中的编码是13;LF是换行符(\n),在ASCII中的编码是10.

http请求报文示例:
GET /simple.html HTTP/1.1<CRLF>           ----- 首行 
Accept: text/html<CRLF>               -- 
Accept-Language: zh-cn<CRLF>             
Accept-Encoding: gzip, deflate<CRLF>    -- 头部 
User-Agent: Mozilla/4.0<CRLF>            
Host: localhost:8080<CRLF>               
Connection: Keep-Alive<CRLF>          -- 
<CRLF>                                ----- 空白行表示头部的结束
                                      ----- 接下来的内容是正文部分

可以清楚地看到,第一行是首行,以CRLF标志其结束;接下来是头部,含有多个消息头,每行定义一个消息头,以CRLF标志其结束;一个单独的CRLF(紧接着上一个CRLF)表示整个头部的结束,接下来是正文部分。在这个示例中,正文部分为空

它们在消息实体中是连续的片段,并不像代码中所示那样有换行的结构。换句话说,原始的消息应该是如下形式:

GET /simple.html HTTP/1.1Accept: text/htmlAccept-Language: zh-cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0Host: localhost:8080Connection: Keep-Alive

HTTP请求

之前已经说过,HTTP请求消息分为三个部分:

  • 请求行
  • 请求头部
  • 请求正文

其中请求头部的格式我们已经见过。请求行的基本格式为:

方法 路径 版本

例如下面的例子:
GET /simple.html HTTP/1.1
就有对应关系:
  • 方法:GET
  • 路径:/simple.html
  • 版本:HTTP/1.1

HTTP请求:方法

首先列出最常用的HTTP方法:
  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • HEAD
  • OPTIONS

每个HTTP方法,都是有一些HTTP协议要求的。比如说GET方法请求的资源,浏览器端一般都会有缓存,下次请求的时候可能从缓存中去取就够了,服务器不用再重复发送相同的资源了;但是服务器如果将获取资源的接口的方法定义为POST,那么浏览器端就不会再对资源进行缓存了,即使每次取到的都是同样地内容,都会请求服务器重新发送一遍。所以说,将请求资源的接口的方法定义为POST而不是GET,就是一种不合理的设计。

再比如,GET方法的请求消息是不能定义消息体的,HEAD方法的请求其响应消息是不包含消息体的,这些都是HTTP协议对于HTTP方法的约束

HTTP请求:路径

路径的基本格式一般是:
basic-path[?query-string]

问号后面的部分就是query-string。它的格式是任意的,只要客户端和服务器约定好一定的形式即可。这个部分一般是请求参数的附加。之前说过,GET方法是不包含请求体的,所以GET方法的HTTP请求想要附加参数只能使用这种方式。当然其他方法也是可以使用这种方式附加参数,只要服务器同意就可以了。query-string的格式任意,但在客户端和服务器之间也有预先定好的约定,即键值对的形式。query-string可以表示成一系列键值对的集合,用以下方式表示:

k1=v1&k2=v2&k3=&k4

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

  • k1: v1
  • k2: v2
  • k3: 空字符串
  • k4: 起码该键被定义了

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

HTTP请求头

HTTP请求头格式与之前所说的消息头格式没什么两样,就是以冒号分隔的键值对。HTTP请求头中,既包含预定义的头(如Content-Type、Content-Length等),也支持自定义头。

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

http消息头大全

HTTP响应

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

  • 响应行
  • 响应头部
  • 响应正文

响应行的基本格式是:

版本号 状态码 状态文本

例如下面的响应行:

HTTP/1.1 200 OK

其对应关系为:

  • 版本号:HTTP/1.1
  • 状态码:200
  • 状态文本:OK

HTTP状态码大全

48人推荐
随时随地看视频
慕课网APP