在本文中,我将向您介绍HTTP的基础知识。
为什么使用HTTP?
为什么我应该阅读有关您可能会问自己的HTTP?
那么,如果你是一个软件开发者,你就会明白如何通过学习他们如何沟通来编写更好的应用程序。如果您是系统架构师或网络管理员,您将会对设计复杂的网络架构有更深入的了解。
当今非常重要的架构风格REST完全依赖于HTTP功能,因此使HTTP更加重要。如果你想制作很好的RESTful应用程序,你必须先了解HTTP。
我不应该认为REST不仅仅依赖于HTTP。它可以使用其他协议来实现,但HTTP似乎远胜于此,并且很难找到使用其他协议的REST实现。
那么你是否愿意传递机会去理解和学习万维网和网络通信的基本概念?
本文将重点介绍HTTP中最重要的部分,并试图尽可能简单地解释它们。这个想法是在一个地方组织所有有关HTTP的有用信息,为您节省阅读书籍和RFC的时间以找到您需要的信息。
毫不迟疑,让我们潜入。
HTTP定义
HTTP的创始人是Tim Berners-Lee (该人也被认为是万维网的发明人)。其他对HTTP开发很重要的名字还有Roy Fielding,他也是REST架构风格的创始人。
超文本传输协议是应用程序用来相互通信的协议。本质上,HTTP负责委托客户端和服务器之间的所有互联网媒体文件。这包括HTML,图像,文本文件,电影和其中的一切。它可以快速可靠地完成这项工作。
HTTP是 应用程序协议而不是传输协议,因为它用于应用程序层的通信。在这里慢跑你的记忆是网络堆栈的样子。

从这张图片中,您可以清楚地看到HTTP是应用程序协议,并且TCP在传输层上工作。
资源

互联网上的所有内容都是资源,HTTP与资源一起工作。这包括文件,流,服务和其他一切。一个HTML页面是一个资源,一个YouTube视频是一个资源,一个Web应用程序的日常任务的电子表格是一个资源...你明白了。
你如何区分一种资源与另一种资源?
通过给他们URL(统一资源*位器定**)。
URL指向可以找到资源的唯一位置。
在WEB客户端和WEB服务器之间如何交换消息
每一个内容,每个资源都存在于某个Web服务器(HTTP服务器)上。这些服务器正在等待这些资源的HTTP请求。
但是,您如何从Web服务器请求资源?
当然你需要一个HTTP客户端
您现在正在使用HTTP客户端来阅读本文。Web浏览器是HTTP客户端。他们与HTTP服务器通信以将资源提取到您的计算机。一些最受欢迎的客户是Google的Chrome,Mozilla的Firefox,Opera,Apple的Safari,不幸的是仍然是臭名昭着的Internet Explorer。
消息和一些消息示例
那么HTTP消息是什么样的?
不用太多地谈论它,下面是一些HTTP消息的例子:
GET请求
GET/repos/CodeMazeBlog/ConsumeRestfulApisExamples HTTP/1.1
Host:api.github.com
Content-Type:application/json
Authorization:Basic dGhhbmtzIEhhcmFsZCBSb21iYXV0LCBtdWNoIGFwcHJlY2lhdGVk
Cache-Control:no-cache
POST请求
POST/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks?access_token=5643f4128a9cf974517346b2158d04c8aa7ad45fHTTP/1.1
Host:api.github.com
Content-Type:application/json
Cache-Control:no-cache
{
"url":"http://www.example.com/example",
"events":[
"push"
],
"name":"web",
"active":true,
"config":{
"url":"http://www.example.com/example",
"content_type":"json"
}
}
以下是一个GET和一个POST请求的示例。让我们快速浏览这些请求的不同部分。
该请求的第一行是为请求行保留的。它由 请求方法名称,请求URI和 HTTP版本组成。
接下来的几行代表请求头。请求标头为请求提供了额外的信息,例如请求期望响应的内容类型,授权信息等,
对于GET请求,故事就此结束。一个POST请求也可以有一个主体并且以主体消息的形式携带额外的信息。在这种情况下,它是一个JSON消息,其中包含有关如何为URI中指定的repo创建GitHub webhook的其他信息。该消息是webhook创建所必需的,因此我们使用POST请求将该信息提供给GitHub API。
请求行和请求头必须后跟(回车和换行符\ r \ n),并且消息头和消息正文之间仅包含一条仅包含CRLF的空行。
HTTP请求参考:https: //www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
作为对这些要求的回应,我们得到了什么?
响应消息
HTTP/1.1200OK
Server:GitHub.com
Date:Sun,18Jun201713:10:41GMT
Content-Type:application/json;charset=utf-8
Transfer-Encoding:chunked
Status:200OK
X-RateLimit-Limit:5000
X-RateLimit-Remaining:4996
X-RateLimit-Reset:1497792723
Cache-Control:private,max-age=60,s-maxage=60
[
{
"type":"Repository",
"id":14437404,
"name":"web",
"active":true,
"events":[
"push"
],
"config":{
"content_type":"json",
"insecure_ssl":"0",
"url":"http://www.example.com/example"
},
"updated_at":"2017-06-18T12:17:15Z",
"created_at":"2017-06-18T12:03:15Z",
"url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404",
"test_url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/test",
"ping_url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/pings",
"last_response":{
"code":422,
"status":"misconfigured",
"message":"Invalid HTTP Response: 404"
}
},
]
响应消息的结构与请求相同,只是第一行称为 状态行,它令人惊讶,其中包含有关响应状态的信息。
状态行后面跟着响应头和响应主体。
HTTP响应参考:https: //www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
MIME类型
MIME类型被用作标准化的方式来描述互联网上的文件类型。您的浏览器具有MIME类型列表,Web服务器也是如此。这样,无论操作系统如何,文件都可以以相同的方式传输。
有趣的是,MIME代表多用途Internet邮件扩展,因为它们最初是为多媒体电子邮件而开发的。自那以后,它们被改编用于HTTP和其他一些协议。
每种MIME类型都由以下格式的类型,子类型 和可选参数 列表组成 : type / subtype; 可选参数。
这里有一些例子:
Content-Type:application/json
Content-Type:text/xml;charset=utf-8
Accept:image/gif
您可以在HTTP参考中找到常用MIME类型和子类型的列表 。
请求方法
HTTP请求方法(也称为“动词”)定义将在资源上执行的操作。HTTP定义了几种请求方法。最常用的/使用的是GET和POST方法。
请求方法可以是幂等的或不是幂等的。这仅仅是解释该方法在同一资源上被多次调用的安全/不安全的一个奇特术语。换句话说,这意味着只有检索信息的GET方法默认应该是幂等的。一次又一次调用同一资源上的GET应该不会导致不同的响应。另一方面,POST方法不是一个幂等方法。
在HTTP / 1.1之前,只有三种方法:GET,POST和HEAD,并且HTTP / 1.1的规范带来了更多的方法: OPTIONS,PUT,DELETE,TRACE和CONNECT。
在HTTP参考中查找更多这些方法的工作原理 。
头
标题字段是可以在请求或响应消息的第一行之后找到的以冒号分隔的名称值字段。它们为HTTP消息提供了更多的上下文,并确保客户端和服务器得到适当的关于请求或响应性质的信息。
有五种类型的标题:
-
常规标题: 这些标题对服务器和客户端都有用。日期标题字段就是一个很好的例子,它提供了有关创建消息的时间的信息。
-
请求标头: 特定于请求消息。他们向服务器提供更多信息。例如, Accept:* / *标头字段通知服务器客户端愿意接收任何媒体类型。
-
响应标头: 特定于响应消息。他们向客户提供附加信息。例如, 允许:GET,HEAD,PUT标题字段通知客户端哪些方法被允许用于请求的资源。
-
实体标头: 这些标头处理实体主体。例如, Content-Type:text / html 头让应用程序知道数据是HTML文档。
-
扩展头文件: 这些是由应用程序开发人员构建的非标准头文件。它们不是HTTP的一部分,但需要被容忍。
您可以在HTTP参考中找到常用请求和响应头的列表 。
状态码

状态代码就是一个表示请求的结果的三位数。紧接着是人类可读的状态码解释的原因短语。
一些例子包括:
-
200 OK
-
404未找到
-
500内部服务器错误
状态代码按五个不同组别的范围进行分类。
状态码分类和状态码的完整列表及其含义可以在HTTP参考中找到 。
结论
唷,那是很多的信息。
通过学习HTTP获得的知识不是可以帮助您直接解决某些问题的那种知识。但是它让你了解互联网通信的基本原理,你可以将它应用于比HTTP更高层次的几乎所有其他问题。无论是REST,API,Web应用程序开发还是网络,您现在都可以在解决这些问题时至少更有信心。
当然,HTTP是一个相当大的话题,而且它的基本概念还有很多。
在HTTP系列的第2部分中了解HTTP的体系结构方面。
这篇文章对你有帮助吗?请留下评论,并让我知道。