HTTP 协议

如果您在 https://tools.ietf.org/html/rfc2068 上查看 RFC2068 标准,就会发现它的描述几乎无穷无尽。幸运的是,关于这个协议,至少对于初学者来说,你需要知道的东西要短得多。

HTTP 是超文本传输协议(HyperText Transfer Protocol)的缩写。与其他协议一样,其目标是让两个实体或节点相互通信。为了实现这一目标,信息需要以双方都能理解的方式格式化,而且实体必须遵守一些预先制定的规则。

一个简单的例子

下图显示了非常基本的消息交换:

image 2023 11 01 14 26 55 838
Figure 1. A simple GET request

如果您不理解本图中的所有元素,请不要担心,我们很快就会对其进行描述。在这个表示法中,有两个实体:发送方和接收方。发送方向接收方发送一条信息。开始通信的这条信息称为请求。在本例中,信息是一个 GET 请求。接收方收到信息后进行处理,并生成第二条信息:响应。在本例中,响应显示 200 状态代码,这意味着请求已成功处理。

HTTP 是无状态的,也就是说,它独立处理每个请求,与之前的请求无关。这意味着,有了这个请求和响应序列,通信就结束了。任何新的请求都不会注意到这一特定的信息交换。

消息的部分内容

HTTP 消息包含几个部分。 我们将仅定义其中最重要的部分。

网址

信息的 URL 就是信息的目的地。请求将包含接收方的 URL,而响应将包含发送方的 URL。

大家可能都知道,URL 可以包含额外的参数,即查询字符串。当发送方希望添加额外数据时,就会使用查询字符串。例如,请看这个 URL: http://myserver.com/greeting?name=Alex 。该 URL 包含一个参数:名称,其值为 Alex。它不能作为 URL http://myserver.com/greeting 的一部分,因此发送者选择将其添加到 URL 的末尾。稍后您将看到,这并不是我们在信息中添加额外信息的唯一方法。

HTTP 方法

HTTP 方法是消息的动词。它标识发送者想要对此消息执行什么类型的操作。最常见的是 GET 和 POST。

  • GET:这是向接收方询问某些信息,接收方通常会将这些信息发送回来。最常见的例子是询问一个网页,接收方会回复所请求网页的 HTML 代码。

  • POST:这意味着发送方希望执行一项操作,更新接收方持有的数据。例如,发送方可以要求接收方更新其个人资料名称。

还有其他方法,如 PUTDELETEOPTION,但它们在网络开发中使用较少,不过在 REST API 中起着至关重要的作用,这将在第 9 章 "构建 REST API" 中介绍。

Body

正文部分通常出现在响应报文中,尽管请求报文也可以包含正文部分。报文正文包含报文本身的内容;例如,如果用户请求一个网页,那么响应的正文将由表示该网页的 HTML 代码组成。

很快,我们将讨论请求如何也包含正文,正文用于发送作为请求一部分的额外信息,如表单参数。

body 可以包含任何格式的文本;可以是表示网页的 HTML 文本、纯文本、图像内容、JSON 等。

标头

HTTP 报文的报文头是接收者理解报文内容所需的元数据。头有很多,你将在本书中看到其中一些。

头由键值对映射组成。下面可能是一个请求的标头:

Accept: text/html
Cookie: name=Richard

该请求告诉接收方(即服务器)它将接受 HTML 文本,这是表示网页的常用方式;它有一个名为 Richard 的 cookie。

状态码

状态代码存在于响应中。它用数字代码标识请求的状态,以便浏览器和其他工具知道如何做出反应。例如,如果我们试图访问一个不存在的 URL,服务器应该回复状态代码 404。这样,浏览器甚至不用查看响应内容就能知道发生了什么。

常见的状态代码有:

  • 200:请求成功

  • 401:未经授权;用户没有权限查看该资源

  • 404:页面不存在

  • 500:内部服务器错误; 服务器端发生错误且无法恢复

一个更复杂的例子

下图显示了 POST 请求及其响应:

image 2023 11 01 14 39 13 366
Figure 2. A more complex POST request

在这次信息交换中,我们可以看到另一种重要方法 POST 的作用。在这种情况下,发送者试图发送一个请求,以更新某个实体的数据。信息中包含一个值为 84 的 cookie ID,它可以识别要更新的实体。正文中还包含两个参数:姓名和年龄。这就是接收者要更新的数据。

提交网络表单

将参数作为正文的一部分是提交表单时发送信息的常用方法,但并非唯一方法。您可以在 URL 中添加查询字符串,在信息正文中添加 JSON 等等。

响应的状态代码为 200,表示请求已成功处理。此外,响应还包含一个正文,这次格式为 JSON,表示更新实体的新状态。