0

[翻译]理解 HTTP 基础

 2 years ago
source link: https://caihongtengxu.github.io/2019/20191221/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


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

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

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

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

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

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

HTTP协议如何工作

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

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

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

这意味着:

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

请求和响应的结构

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

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

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

使用简单的 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

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

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

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

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

HTTP响应和响应码

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

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

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

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

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

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

中文参见:MDN_HTTP_STATUS

请求响应示例

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

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

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

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

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

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

目前为止我们还没有提到请求类型,但是在我们的例子中,我们已经见过了 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应用


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK