跳转至

第3章:HTTP基础知识

在你开始你的Vapor之旅之前,你将首先回顾一下网络和HTTP如何运作的基础知识。

本章解释了您需要了解的有关HTTP的知识、它的方法和最常见的响应代码。 您还将了解Vapor如何增强您的Web开发体验、它的优势以及它与其他Swift框架的区别。

为网络提供动力

超文本传输协议或HTTP是网络的基础。 每次访问网站时,浏览器都会向服务器发送HTTP请求并从服务器接收响应。 许多专用应用程序——从您的智能手机订购咖啡、将视频流式传输到您的电视或玩在线游戏——在幕后使用HTTP

HTTP的核心很简单。 有一个客户端——一个iOS应用程序、一个网络浏览器甚至一个简单的cURL会话——和一个服务器。 客户端向服务器发送HTTP请求,服务器返回HTTP响应。

img

HTTP请求

一个HTTP请求由几个部分组成:

  • 请求行:指定要使用的HTTP方法、请求的资源和HTTP版本。 GET /about.html HTTP/1.1 就是一个例子。 您将在本章后面了解HTTP版本。
  • 主机:处理请求的服务器名称。 当多个服务器托管在同一地址时,需要这样做。
  • 其他请求标头,例如授权、接受、缓存控制、内容长度、内容类型等。
  • 可选请求数据,如果HTTP方法需要。

HTTP方法指定客户端请求的操作类型。HTTP规范定义了以下方法:

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE
  • PATCH

最常见的HTTP方法是GET。 它允许客户端从服务器检索资源。 单击浏览器中的链接或点击新闻应用中的故事都会触发对服务器的GET请求。

另一种常见的HTTP方法是POST。 它允许客户端向服务器发送数据。 输入用户名和密码后单击登录按钮可以触发对服务器的POST请求。 在阅读本书的过程中,您将了解其他HTTP方法。

通常,服务器需要的不仅仅是资源名称才能正确地为请求提供服务。 此附加信息在请求标头中发送。请求标头只不过是键值对。

一些常见的请求标头是:AuthorizationCookieContent-TypeAccept。您将在后面的章节中了解Vapor如何使用其中的一些来使您的服务器端应用程序更加健壮。

HTTP响应

服务器在处理完请求后返回HTTP响应。HTTP响应包括:

  • 状态行:包含版本、状态代码和消息
  • 响应头
  • 一个可选的响应体

状态代码及其相关消息表示请求的结果。状态代码有很多,但您不会使用或遇到其中的大部分。 根据第一个数字,它们分为5组:

  • 1:信息响应。这些并不经常发生。
  • 2:成功响应。最常见的200 OK表示请求已成功完成。
  • 3:重定向响应。这些经常使用。
  • 4:客户端错误。最常见的一种是404 Not Found。 您可能已经看到了一些不同且有趣的404页面!
  • 5:服务器错误。这通常表示服务器配置不当、资源耗尽或服务器端应用程序中存在错误。

甚至还有一个愚人节笑话状态码:418 I'm a teapot

响应可能包括响应正文,例如页面的HTML内容、图像文件或资源的JSON描述。 然而,响应主体是可选的,一些响应代码——例如204 No Content——将没有。

最后,响应可能包含一些响应标头。这些类似于前面描述的请求标头。 一些常见的响应标头是:Set-CookieWWW-AuthenticateCache-ControlContent-Length

Web浏览器中的HTTP

当您要求浏览器加载页面时,它会为该页面发送一个HTTP GET请求。 服务器在响应正文中返回HTML。 当浏览器解析HTML时,它会为页面引用的任何资产(图像、JavaScriptCSS)生成额外的HTTP GET请求。

格式正确的HTML页面同时包含<head><body>部分。 处理页面时,浏览器会等待,直到它接收到<head>部分中引用的所有外部资源以呈现页面。 客户端在收到资产时呈现<body>部分中引用的资产。

Web浏览器仅使用GETPOST HTTP方法。 大多数浏览器请求都是GET请求。 浏览器可以使用POST提交表单数据或上传文件。 这在后面的章节中会变得很重要; 然后你将学习解决这个问题的技巧。 如果不使用JavaScript,也不可能自定义浏览器发送的请求标头。

iOS应用中的HTTP

您的iOS应用程序——这也适用于其他HTTP客户端,例如RestedJavaScriptPostman——受到的限制要少得多。这些应用程序能够使用所有HTTP方法、添加自定义请求标头并实现自定义响应处理。这是更多的工作,但灵活性使您可以自由地开发您需要的东西。

HTTP 2.0

今天大多数Web服务使用HTTP 1.1版——于19971月作为RFC 2068发布。到目前为止,你学到的所有内容都是HTTP/1.1的一部分,除非另有说明,否则都是本书中使用的版本。

HTTP/2扩展了客户端和服务器之间的通信,以提高效率并减少延迟。单个请求与HTTP/1.1中的请求相同,但它们可以并行处理。服务器可以预测客户端的请求,并在客户端请求之前将样式表和图像等数据推送给客户端。Vapor在其客户端和服务器功能中都支持HTTP/1.1HTTP/2

REST

REST,或表示状态传输,是与HTTP密切相关的体系结构标准。 应用程序使用的许多API都是REST API,您会经常听到这个术语。 您将在第7章“CRUD数据库操作”中了解更多关于REST及其与HTTPCRUD的关系。REST提供了一种定义从API访问资源的通用标准的方法。 例如,对于首字母缩略词API,您可以定义以下端点:

  • GET /api/acronyms/: 获取所有首字母缩略词。
  • POST /api/acronyms:创建一个新的首字母缩略词。
  • GET /api/acronyms/1: 获取ID1的首字母缩写词。
  • PUT /api/acronyms/1:使用ID1更新首字母缩略词。
  • DELETE /api/acronyms/1: 删除ID1的首字母缩略词。

拥有从REST API访问资源的通用模式简化了构建客户端的过程。

为什么要使用Vapor

使用SwiftVapor开发服务器端应用程序是一种独特的体验。 与许多传统的服务器端语言(例如 PHPJavaScriptRuby)相比,Swift是强类型和静态类型的。 这一特性大大减少了iOS应用程序运行时崩溃的次数,您的服务器端应用程序也将享受到这一好处。

服务器端Swift的另一个潜在好处是提高了性能。 由于Swift是一种编译型语言,使用Swift编写的应用程序可能比使用解释型语言编写的应用程序性能更好。

然而,编写服务器端Swift应用程序的最大原因是您可以使用SwiftSwift是发展最快、最受欢迎的语言之一,其现代语法和功能结合了众多语言的优点。 如果您目前正在为iOS开发,您可能已经非常了解这门语言。 这意味着您可以开始在服务器端应用程序和iOS应用程序之间共享核心业务逻辑代码和模型。

选择Swift还意味着您可以使用Xcode来开发您的服务器应用程序! 虽然Linux上的FoundationiOSmacOS上的一个子集,但您可以在Xcode中完成大部分开发工作。 这使您可以访问IDE中强大的调试功能,这是大多数服务器端语言所没有的功能。

Vapor和服务器端Swift生态系统

Vapor已成为主要的高级服务器端Swift框架,其开发人员与Swift服务器工作组 (SSWG) 密切合作。SSWG是一个指导团队,旨在促进在服务器上使用Swift。它由来自Apple和社区的工程师组成,包括Vapor核心团队。

SSWG还针对构建在 SwiftNIO之上的推荐项目(例如PostgreSQL驱动程序和指标库)提供孵化过程。 因为Vapor也是构建在SwiftNIO之上的,所以您可以将这些包中的任何一个与您的服务器端Swift应用程序一起使用。 其中许多项目已经集成到Vapor中!

最后,Vapor拥有一个非常活跃和充满活力的社区,我们鼓励您参与其中!