第一章:Web APIs
在开始构建自己的网络API之前,请务必先回顾网络的实际是怎样运行的。 毕竟,“ Web API”实际上位于万维网的现有体系结构之上,并且依赖于包括HTTP,IP / TCP等在内的多种技术。 在本章中,我们将回顾Web API的基本术语:
- 终端
- Resource
- HTTP 动词
- HTTP状态码
- REST。
即使您已经对这些术语感到熟悉,我还是鼓励您完整阅读本章。
万维网
互联网是至少从1960年代就已经存在的互连计算机网络系统。 但是,互联网的早期使用仅限于少数几个隔离的网络,这些网络主要是政府,军事或科学性质的,可以通过电子方式交换信息。 到1980年代,许多研究机构和大学都在使用Internet共享数据。 在欧洲,最大的互联网节点位于瑞士日内瓦的CERN(欧洲核研究组织),该实验室经营着世界上最大的粒子物理实验室。 这些实验产生大量数据,需要与世界各地的科学家远程共享。
但是,与今天相比,1980年代的整体互联网使用量很小。 大多数人无法使用它,甚至无法理解它为什么重要。 少数Internet节点为所有流量提供动力,而使用它的计算机主要位于同一小型网络中。
1989年,CERN的研究科学家蒂姆·伯纳斯·李(Tim Berners-Lee)发明了HTTP并引入了现代的万维网,这一切都改变了。 他的远见卓识是,可以将现有的超文本系统(其在计算机屏幕上显示的文本包含指向其他文档的链接(超链接))移动到Internet上。
他的发明--超文本传输协议(HTTP)是第一个标准的,全球通过Internet共享文档的方式。 它引入了网页的概念:带有URL,链接和资源(例如图像,音频或视频等)的分散文档。
如今,当大多数人想到“互联网”时,他们想到的是万维网(World Wide Web),这是数十亿人和计算机在线通信的主要方式。
URLs
URL(统一资源定位符)是互联网上资源的地址。 例如,Google主页位于https://www.google.com。
当您要转到Google主页时,请在网络浏览器中键入完整的URL地址。 然后,您的浏览器通过Internet发送请求,并与服务器建立了神奇的连接(我们将介绍实际发生的情况),该服务器使用在浏览器中呈现Google主页所需的数据进行响应。
此请求和响应模式是所有Web通信的基础。 客户端(通常是Web浏览器,但也有本机应用程序或实际上任何与Internet连接的设备)请求信息,而服务器则以响应进行响应。
由于网络通信是通过HTTP进行的,因此这些形式更正式地称为HTTP请求和HTTP响应。
在给定的URL中,还有几个离散的组件。 例如,再次考虑https://www.google.com。第一部分,https,指的是使用的scheme。 它告诉Web浏览器如何访问该位置的资源。 对于网站,通常是http或https,但是也可以是ftp(用于文件),smtp(用于电子邮件)等等。 下一部分www.google.com是网站的主机名或实际名称。每个URL都包含一个方案和一个主机。
许多网页也包含可选路径。如果您访问Python官网https://www.python.org,Python,然后单击“关于”页面的链接,您将被重定向到 https://www.python.org/about/。/about /是路径。
总而言之,每个https://python.org/about/ 之类的URL都有三个潜在部分:
互联网协议套件
一旦我们知道了资源的实际URL,其他所有技术的全部集合就必须正常工作(一起)以将客户端与服务器连接并加载实际的网页。 这被广泛称为Internet procotol套件,并且整本书都围绕该主题编写。 但是,出于我们的目的,我们可以坚持广泛的基础知识。
当用户在其网络浏览器中输入https://www.google.com并点击Enter时,会发生一些事情。 首先,浏览器需要在广阔的互联网上的某个地方找到所需的服务器。 它使用域名服务(DNS)将域名“ google.com”转换为IP地址,该IP地址是代表互联网上每个已连接设备的唯一数字序列。 使用域名是因为,与“ 172.217.164.68 ” 这样的IP地址相比,人类更容易记住“ google.com”这样的域名。
浏览器具有给定域名的IP地址后,它需要一种方法来与所需服务器建立一致的连接。 这是通过传输控制协议(TCP)进行的,该协议可在两个应用程序之间提供可靠,有序和经过错误检查的字节传输。
为了在两台计算机之间建立TCP连接,客户端和服务器之间会发生三次“握手”:
一旦建立TCP连接,两台计算机就可以开始通过HTTP通信。
HTTP 动词
每个网页都包含一个地址(URL)以及一系列被批准的动作,称为HTTP动词。 到目前为止,我们主要讨论了获取网页的问题,但是也可以创建,编辑和删除内容。
考虑一下Facebook网站。 登录后,您可以阅读时间轴,创建新帖子或编辑/删除现有帖子。 创建,读取,更新,删除这四个动作俗称CRUD功能,它们代表了绝大多数在线采取的动作。
HTTP协议包含许多从服务器请求信息时可以使用的请求方法。四个最常见的CRUD:它们是POST,GET,PUT和DELETE。
若要创建内容,请使用POST,读取内容GET,对其进行更新,然后使用DELETE进行删除。
终端
网站由包含HTML,CSS,图像,JavaScript等的网页组成。 但是,Web API具有终结点,而终结点是带有公开数据的可用操作(HTTP动词)列表的URL(通常为JSON,这是当今最常见的数据格式,并且是Django REST Framework的默认格式)。 例如,我们可以为一个名为mysite的新网站创建以下API端点。
https://www.mysite/api/users # Get returns all users
https://www.mysite/api/users/<id> # Get returns a single user
在第一个端点/ api / users中,可用的GET请求返回所有可用用户的列表。 这种返回多个数据资源的端点称为集合。
第二个端点/ api / users / 代表一个用户。 GET请求仅返回有关该用户的信息。
如果将POST添加到第一个端点,则可以创建一个新用户,而将DELETE添加到第二个端点,则可以删除单个用户。
在本书的学习过程中,我们将更加熟悉API端点,但是最终创建API涉及到一系列端点:带有关联HTTP动词的URL。
网页包含HTML,CSS,图像等。 但是端点只是通过可用的HTTP动词访问数据的一种方式。
HTTP
在本章中,我们已经讨论了很多HTTP,但是在这里我们将描述HTTP的实际含义和工作方式。 HTTP是具有现有TCP连接的两台计算机之间的请求-响应协议。 发出请求的计算机称为客户端,而响应的计算机称为服务器。 通常,客户端是Web浏览器,但也可以是iOS应用或任何与互联网连接的设备。 服务器是经过优化可通过Internet工作的任何计算机的名字。 我们需要将一台基本笔记本电脑转变为一台服务器所需的一切,就是一些特殊的软件和持久的Internet连接。
每个HTTP消息均包含一个请求/状态行,请求头和可选的正文数据。 例如,这是一个示例HTTP消息,浏览器可能会发送该HTTP消息来请求位于https://www.google.com的Google主页。
GET / HTTP/1.1
Host: google.com
Accept_Language: en-US
第一行称为请求行,它指定要使用的HTTP方法(GET),路径(/)以及要使用的特定HTTP版本(HTTP / 1.1)。
随后的两行是HTTP标头:Host是域名,
Accept_- Language是要使用的语言,在这种情况下是美国英语。 有许多HTTP标头可用。
HTTP消息还有一个可选的第三部分,称为主体。 但是,我们只会看到带有HTTP响应的正文消息,其中包含数据。
为简单起见,假设Google主页仅包含HTML“ Hello,World!” 这就是来自Google服务器的HTTP响应消息。
HTTP/1.1 200 OK
Date: Wed, 28 Oct 2019 23:26:07 GMT
Server: gws
Accept-Ranges: bytes
Content-Length: 13
Content-Type: text/html; charset=UTF-8
Hello, world!
第一行是响应行,它指定我们正在使用HTTP / 1.1。 状态码200 OK指示客户端的请求已成功(稍后会更多关于状态码的信息)。
接下来的八行是HTTP标头。 最后,在换行后,我们的实际正文内容为“ Hello,world!”。
因此,每个HTTP消息(无论是请求还是响应)都具有以下格式:
Response/request line
Headers...
(optional) Body
大多数网页包含多个资源,这些资源需要多个HTTP请求/响应周期。 如果一个网页具有HTML,一个CSS文件和一个图像,则在浏览器中呈现完整的网页之前,需要在客户端和服务器之间来回往返三趟。
状态码
一旦您的Web浏览器在URL上执行了HTTP请求,就不能保证一切都会真正生效! 因此,有很长的HTTP状态代码列表可用于伴随每个HTTP响应。
您可以根据以下系统判断状态码的一般类型:
要记住的重要一点是,一般而言,任何给定的HTTP请求只有四个潜在结果:它起作用(2xx),它以某种方式重定向(3xx),客户端出错(4xx)或服务器发出错误(5xx)。
这些状态代码会自动放置在每条HTTP消息顶部的请求/响应行中。
无状态
关于HTTP的最后一个重要点是,它是一个无状态协议。 这意味着每个请求/响应对都完全独立于前一个。 过去的交互没有存储的内存,在计算机科学中称为状态。
无状态为HTTP带来了很多好处。 由于所有电子通信系统都会随着时间流逝而丢失信号,因此,如果我们没有无状态协议,那么如果不经历一个请求/响应周期,事情就会不断中断。 结果,HTTP被称为非常有弹性的分布式协议。
但是缺点是,在Web应用程序中,状态管理非常重要。 说明网站是如何记住您已登录的,以及电子商务网站如何管理您的购物车。 这是我们使用现代网站的基础,但HTTP本身不支持它。
历史上状态是在服务器上维护的,但是在诸如React,Angular和Vue之类的现代前端框架中,它已越来越多地转移到客户端,Web浏览器。 当我们介绍用户身份验证时,我们将详细了解状态,但是请记住,HTTP是无状态的。 这非常有利于在两台计算机之间可靠地发送信息,但不利于记住每个单独的请求/响应对之外的任何内容。
REST
代表性状态转移(REST)是Roy Fielding在其论文中于2000年首次提出的体系结构。 它是一种在Web之上(即在HTTP协议之上)构建API的方法。
关于使API实际上是否为RESTful的原因,已经撰写了整本书。 但是出于我们的目的,我们将在此处重点关注三个主要特征。每个RESTful API:
任何RESTful API至少必须具有这三个原则。 该标准很重要,因为它提供了设计和使用Web API的一致方法。
总结
尽管现代互联网具有很多技术,但作为开发人员,我们不必从头开始实施所有技术。 Django和Django REST Framework的完美结合可以正确处理Web API涉及的大多数复杂性。 但是,重要的是要至少对所有部件如何组合在一起有一个广泛的了解。
最终,Web API是端点的集合,这些端点公开了基础数据库的某些部分。 作为开发人员,我们控制每个端点的URL,可用的基础数据以及可以通过HTTP动词执行的操作。 通过使用HTTP标头,我们还可以设置各种级别的身份验证和权限,这将在本书的后面部分中介绍。