[翻译]理解 HTTP 基础

最近刷阮一峰的博客发现一篇很好的基础文章,来翻译下,锻炼下英文阅读也不错。


简介

http_icon

HTTP 代表超文本传输协议,用于跨网络传输数据。

它是 web 开发人员需要理解的一个关键协议,因为它被广泛使用,也被用于物联网应用程序中的数据和命令传输。

在协议的第一个版本只有一个方法,即 GET,它将从服务器请求一个页面。而来自服务器的响应总是一个HTML页面 WiKi

为了让你了解 HTTP 协议在开始时有多么简单,可以看一下只有1页的 Original 规范

从最初的 0.9版本 开始,至今已经有了好几个版本的HTTP协议。

目前的版本是1.1,最近一次修订是在2014年。 详情请参阅 Wiki

HTTP协议如何工作

像大多数的协议一样,HTTP是一个使用 客户端=>服务器 通信模型的基于 命令响应文本 的协议。

HTTP-Protocol-Basics

客户端发出请求,服务器进行响应。

HTTP协议也是一个无状态协议,这表示服务器不需要存储会话信息,并且每个请求对于其他请求而言都是独立的。可以参见这个 wiki

这意味着:

  • 所有的请求都是客户端发起的(也就是你的浏览器发起)
  • 服务器对每个请求进行响应
  • 请求(命令)和响应都是可读的文本
  • 请求之间是相互独立的并且服务器 不需要 去跟踪请求

请求和响应的结构

请求和响应的消息结构都是一样的,如下所示

http-request-response-structure

一个请求由 命令或者请求 + 可选的头部 + 可选的正文内容 组成

一个响应由 状态码 + 可选的头部 + 可选的正文内容 组成

使用简单的 CRLF(回车和换行)组合来限定每一部分,并使用空白行来表示请求头的结束。

如果请求或者响应包含了消息正文,则需要在请求头明确指示出来。

请求中消息正文的存在由请求头中的字段 Content-Length 或者 Transfer-Encoding 来表示。

请求消息的结构是独立于方法语义的,即使该方法未限定任何消息正文的用途。参见 RFC 7230 第3.3节

注意:消息正文后没有CRLF(回车和换行),见 RFC 7230 第3.5节

HTTP请求

我们已经看到了一般的请求响应格式,现在我们来更详细的了解他们。

第一行是强制性的必须要有,而且他的格式如下:

请求方法 + 资源路径 + 协议版本

举个例子:假设我们准备在 www.testsite5.com 上请求 testpage.htm 页面

请求的起始行将会是这样:

GET /test.htm HTTP/1.1

  • GET 是请求方法
  • /testpage.htm 是资源的相对路径
  • HTTP/1.1 是我们使用的协议版本号

提示:

1.相对路径不包含域名
2.浏览器使用我们输入的URL来创建资源的相对URI

URI:统一资源标志符,用于标识互联网上的一个资源
URL:统一资源定位符,用来标识互联网的一个资源,同时提供定位该资源的信息。

一句话说:URL是URI的子集,他们都提供了资源是什么,同时URL还提供了如何获取资源。

浏览器不会显示真实的HTTP请求,只有使用诸如Firefox下的 HTTP Header Live 之类的特殊工具才可以看到。

HTTP vs URL

大多数人们习惯在浏览器中输入网址。通常看起来像这样:

url-example-1

网址还会包含一个端口,不过一般情况下都被浏览器隐藏了(默认的80端口),不过呢你也可以手动给他加上,比如下面这样的:

url-example-with-port

这将告诉Web浏览器要定位的资源的地址以及用于检索该资源(http)的协议。

HTTP是传输协议,用来从服务器传输资源(网页,图片,视频等等)到客户端

HTTP响应和响应码

每个请求都会有一个响应。响应由如下组成:

  • 状态码描述
  • 一个或多个可选的响应头参数
  • 多行的可选消息正文,可以包括二进制数据

状态码被分成了5组,每组都有他们的意义和一个3位数的代码

  • 1xx - 信息响应
  • 2xx - 成功响应
  • 3xx - 多项选择(重定向)
  • 4xx - 客户端响应
  • 5xx - 服务端响应

举个例子:一个成功的网页请求会返回响应码200,而一个不成功的请求会返回响应码400

完整的响应码列表和他们的意义 这里

中文参见:MDN_HTTP_STATUS

请求响应示例

我们请求一个简单的网页(testpage.htm),来检查下他们的请求和响应。

下面是我输入在浏览器中的地址

browser-request

下面是浏览器展示出来的响应

browser-response

这里是在输入网址后 HTTP 请求-响应 的截图

HTTP-Request-Response-example

提醒:浏览器会自动的添加上请求和响应头信息

在上面的例子中,请求是没有正文内容的。应答中的正文内容是一个网页,已经显示在浏览器中。

请求类型

目前为止我们还没有提到请求类型,但是在我们的例子中,我们已经见过了 GET 请求类型。

GET请求类型或方法用于从Web服务器请求资源。

GET是最常用的请求类型,并且是原始HTTP规范中唯一的请求类型。

请求类型,方法,动作

HTTP协议现在支持8种请求类型,在文档中也被叫做是方法 或者 动作,他们是:

  • GET - 从服务器请求资源
  • POST - 向服务器提交资源(比如上传文件)
  • PUT - 像POST一样,但是用来替换资源
  • DELETE - 从服务器上删除资源
  • HEAD - 像GET一样,但是只返回请求头,没有正文
  • OPTIONS - 获取资源的选项(一般用来作为预检请求)
  • PATCH - 修改资源
  • TRACE - 执行消息回环(请求接受者原样返回他接受到的消息)

关于Trace方法我自己没有理解 不知道具体啥用,感觉是用来检测中间环节是否有修改请求的地方

在今天的互联网上,GET和POST是使用最多的方法。

其他的一些方法一般用在相关的Web和IOT APIs(物联网) 上。

w3 schoolsMDN网站 上有更多关于它们的详细介绍。

相关教程和资源

TCP/IP协议的初学者指南

使用Curl测试IOT应用


-------------The End-------------