首页
学习
活动
专区
工具
TVP
发布

Web 编程入门:什么是Web API?

在开始构建自己的网络 API 之前,让我们先了解网络的实际是怎样运行的。 毕竟,Web API 实际上位于万维网的现有体系结构之上,并且依赖于包括 HTTP,IP / TCP 等在内的多种技术。

在本文中,我们将回顾 Web API 的基本术语:终端,资源,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 主页时,请在网络浏览器中键入完整的 UR L 地址。 然后,您的浏览器通过 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 ,然后单击“About”页面的链接,您将被重定向到 https://www.python.org/about/

这其中 /about/ 是路径。总而言之,每个 https://python.org/about/ 之类的 URL 都有三个潜在部分:

  • 模式/协议:https
  • 主机/服务器名:python.org
  • 和(可选)路径:/about/

互联网协议传输过程

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

当用户在其网络浏览器中输入 https://www.google.com 并点击 Enter 时,会发生一些事情。

  1. 首先,浏览器需要在广阔的互联网上的某个地方找到所需的服务器。 它使用域名服务(DNS)将域名 google.com 转换为 IP 地址,该 IP 地址是代表互联网上每个已连接设备的唯一数字序列。 使用域名是因为,与“ 172.217.164.68”这样的 IP 地址相比,人类更容易记住“ google.com”这样的域名。
  1. 浏览器得到给定域名的 IP 地址后,它需要一种方法来与所需服务器建立一致的连接。 这是通过传输控制协议(TCP)进行的,该协议可在两个应用程序之间提供可靠,有序和经过错误检查的字节传输。
  2. 为了在两台计算机之间建立 TCP 连接,客户端和服务器之间会发生三次“握手”:
  • 客户端发送 SYN 给服务端,请求建立连接
  • 服务端响应一个 SYN-ACK 确认这次请求,传递一个连接参数
  • 客户端发送 ACK 回给服务器以确认连接

一旦建立 TCP 连接,两台计算机就可以开始通过 HTTP 通信。

HTTP 动词

每个网页都包含一个地址(URL)以及一系列被批准的动作,称为 HTTP 动词。 到目前为止,我们主要讨论了获取网页的问题,但是也可以创建,编辑和删除内容。

考虑一下微博网站。 登录后,您可以阅读时间轴,创建新帖子或编辑/删除现有帖子。

创建,读取,更新,删除这四个动作俗称 CRUD 功能,它们代表了绝大多数在线采取的动作。

HTTP 协议包含许多从服务器请求信息时可以使用的请求方法。 四个最常见的 CRUD:

  • POST
  • GET
  • PUT
  • DELETE

若要创建内容,请使用 POST,读取内容 GET,对其进行 Put 操作,然后使用 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 添加到第二个端点,则可以删除单个用户。

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 响应。

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

  • 2xx 成功:客户请求的操作已收到,理解并接受
  • 3xx 重定向 :所请求的网址已移动
  • 4xx 客户端错误:发生错误,通常是客户端的 URL 请求错误
  • 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:

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

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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/c3941ca6d811ed1a129a24102
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券