Django API 开发:第一章:Web APIs

举报
宇宙之一粟 发表于 2022/05/27 15:20:09 2022/05/27
【摘要】 第一章:Web APIs在开始构建自己的网络API之前,请务必先回顾网络的实际是怎样运行的。 毕竟,“ Web API”实际上位于万维网的现有体系结构之上,并且依赖于包括HTTP,IP / TCP等在内的多种技术。 在本章中,我们将回顾Web API的基本术语:终端ResourceHTTP 动词HTTP状态码REST。​即使您已经对这些术语感到熟悉,我还是鼓励您完整阅读本章。万维网​互联网是...

第一章: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都有三个潜在部分:​

  1. 模式/协议-https​
  2. 主机/服务器名-​www.python.org​​
  3. 和(可选)路径-/ about /

互联网协议套件

一旦我们知道了资源的实际URL,其他所有技术的全部集合就必须正常工作(一起)以将客户端与服务器连接并加载实际的网页。 这被广泛称为Internet procotol套件,并且整本书都围绕该主题编写。 但是,出于我们的目的,我们可以坚持广泛的基础知识。​

当用户在其网络浏览器中输入​https://www.google.com​​并点击Enter时,会发生一些事情。 首先,浏览器需要在广阔的互联网上的某个地方找到所需的服务器。 它使用域名服务(DNS)将域名“ google.com”转换为IP地址,该IP地址是代表互联网上每个已连接设备的唯一数字序列。 使用域名是因为,与“ ​​172.217.164.68​​ ” 这样的IP地址相比,人类更容易记住“ google.com”这样的域名。

浏览器具有给定域名的IP地址后,它需要一种方法来与所需服务器建立一致的连接。 这是通过传输控制协议(TCP)进行的,该协议可在两个应用程序之间提供可靠,有序和经过错误检查的字节传输。​

为了在两台计算机之间建立TCP连接,客户端和服务器之间会发生三次“握手”:​

  1. 客户端发送SYN给服务端,请求建立连接​
  2. 服务端响应一个SYN-ACK确认这次请求,传递一个连接参数​
  3. 客户端发送ACK回给服务器以确认连接​

一旦建立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响应。​

您可以根据以下系统判断状态码的一般类型:​

  1. 2xx 成功- 客户请求的操作已收到,理解并接受​
  2. 3xx 重定向 - 所请求的网址已移动​
  3. 4xx 客户端错误 - 发生错误,通常是客户端的URL请求错误​
  4. 5xx 服务端错误 - 服务器无法解决请求无需记住所有可用的状态代码。通过练习,您将熟悉最常见的设置,例如200(确定),201(创建),301(永久移动),404(未找到)和500(服务器错误)。
    要记住的重要一点是,一般而言,任何给定的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:​

  1. 无状态,像HTTP​
  2. 支持常见的HTTP动词(GET,POST,PUT,DELETE等)​
  3. 以JSON或XML格式返回数据​

任何RESTful API至少必须具有这三个原则。 该标准很重要,因为它提供了设计和使用Web API的一致方法。​


总结

尽管现代互联网具有很多技术,但作为开发人员,我们不必从头开始实施所有技术。 Django和Django REST Framework的完美结合可以正确处理Web API涉及的大多数复杂性。 但是,重要的是要至少对所有部件如何组合在一起有一个广泛的了解。​

最终,Web API是端点的集合,这些端点公开了基础数据库的某些部分。 作为开发人员,我们控制每个端点的URL,可用的基础数据以及可以通过HTTP动词执行的操作。 通过使用HTTP标头,我们还可以设置各种级别的身份验证和权限,这将在本书的后面部分中介绍。​

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。