最近刷阮一峰的博客发现一篇很好的基础文章,来翻译下,锻炼下英文阅读也不错。
简介
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 schools 和 MDN网站 上有更多关于它们的详细介绍。
相关教程和资源