第3章:HTTP基础知识¶
在你开始你的Vapor之旅之前,你将首先回顾一下网络和HTTP如何运作的基础知识。
本章解释了您需要了解的有关HTTP的知识、它的方法和最常见的响应代码。 您还将了解Vapor如何增强您的Web开发体验、它的优势以及它与其他Swift框架的区别。
为网络提供动力¶
超文本传输协议或HTTP是网络的基础。 每次访问网站时,浏览器都会向服务器发送HTTP请求并从服务器接收响应。 许多专用应用程序——从您的智能手机订购咖啡、将视频流式传输到您的电视或玩在线游戏——在幕后使用HTTP。
HTTP的核心很简单。 有一个客户端——一个iOS应用程序、一个网络浏览器甚至一个简单的cURL会话——和一个服务器。 客户端向服务器发送HTTP请求,服务器返回HTTP响应。

HTTP请求¶
一个HTTP请求由几个部分组成:
- 请求行:指定要使用的
HTTP方法、请求的资源和HTTP版本。GET /about.html HTTP/1.1就是一个例子。 您将在本章后面了解HTTP版本。 - 主机:处理请求的服务器名称。 当多个服务器托管在同一地址时,需要这样做。
- 其他请求标头,例如授权、接受、缓存控制、内容长度、内容类型等。
- 可选请求数据,如果
HTTP方法需要。
HTTP方法指定客户端请求的操作类型。HTTP规范定义了以下方法:
GETHEADPOSTPUTDELETECONNECTOPTIONSTRACEPATCH
最常见的HTTP方法是GET。 它允许客户端从服务器检索资源。 单击浏览器中的链接或点击新闻应用中的故事都会触发对服务器的GET请求。
另一种常见的HTTP方法是POST。 它允许客户端向服务器发送数据。 输入用户名和密码后单击登录按钮可以触发对服务器的POST请求。 在阅读本书的过程中,您将了解其他HTTP方法。
通常,服务器需要的不仅仅是资源名称才能正确地为请求提供服务。 此附加信息在请求标头中发送。请求标头只不过是键值对。
一些常见的请求标头是:Authorization、Cookie、Content-Type 和 Accept。您将在后面的章节中了解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-Cookie、WWW-Authenticate、Cache-Control和Content-Length。
Web浏览器中的HTTP¶
当您要求浏览器加载页面时,它会为该页面发送一个HTTP GET请求。 服务器在响应正文中返回HTML。 当浏览器解析HTML时,它会为页面引用的任何资产(图像、JavaScript、CSS)生成额外的HTTP GET请求。
格式正确的HTML页面同时包含<head>和<body>部分。 处理页面时,浏览器会等待,直到它接收到<head>部分中引用的所有外部资源以呈现页面。 客户端在收到资产时呈现<body>部分中引用的资产。
Web浏览器仅使用GET和POST HTTP方法。 大多数浏览器请求都是GET请求。 浏览器可以使用POST提交表单数据或上传文件。 这在后面的章节中会变得很重要; 然后你将学习解决这个问题的技巧。 如果不使用JavaScript,也不可能自定义浏览器发送的请求标头。
iOS应用中的HTTP¶
您的iOS应用程序——这也适用于其他HTTP客户端,例如Rested、JavaScript、Postman——受到的限制要少得多。这些应用程序能够使用所有HTTP方法、添加自定义请求标头并实现自定义响应处理。这是更多的工作,但灵活性使您可以自由地开发您需要的东西。
HTTP 2.0¶
今天大多数Web服务使用HTTP 1.1版——于1997年1月作为RFC 2068发布。到目前为止,你学到的所有内容都是HTTP/1.1的一部分,除非另有说明,否则都是本书中使用的版本。
HTTP/2扩展了客户端和服务器之间的通信,以提高效率并减少延迟。单个请求与HTTP/1.1中的请求相同,但它们可以并行处理。服务器可以预测客户端的请求,并在客户端请求之前将样式表和图像等数据推送给客户端。Vapor在其客户端和服务器功能中都支持HTTP/1.1和HTTP/2。
REST¶
REST,或表示状态传输,是与HTTP密切相关的体系结构标准。 应用程序使用的许多API都是REST API,您会经常听到这个术语。 您将在第7章“CRUD数据库操作”中了解更多关于REST及其与HTTP和CRUD的关系。REST提供了一种定义从API访问资源的通用标准的方法。 例如,对于首字母缩略词API,您可以定义以下端点:
GET /api/acronyms/: 获取所有首字母缩略词。POST /api/acronyms:创建一个新的首字母缩略词。GET /api/acronyms/1: 获取ID为1的首字母缩写词。PUT /api/acronyms/1:使用ID为1更新首字母缩略词。DELETE /api/acronyms/1: 删除ID为1的首字母缩略词。
拥有从REST API访问资源的通用模式简化了构建客户端的过程。
为什么要使用Vapor?¶
使用Swift和Vapor开发服务器端应用程序是一种独特的体验。 与许多传统的服务器端语言(例如 PHP、JavaScript、Ruby)相比,Swift是强类型和静态类型的。 这一特性大大减少了iOS应用程序运行时崩溃的次数,您的服务器端应用程序也将享受到这一好处。
服务器端Swift的另一个潜在好处是提高了性能。 由于Swift是一种编译型语言,使用Swift编写的应用程序可能比使用解释型语言编写的应用程序性能更好。
然而,编写服务器端Swift应用程序的最大原因是您可以使用Swift!Swift是发展最快、最受欢迎的语言之一,其现代语法和功能结合了众多语言的优点。 如果您目前正在为iOS开发,您可能已经非常了解这门语言。 这意味着您可以开始在服务器端应用程序和iOS应用程序之间共享核心业务逻辑代码和模型。
选择Swift还意味着您可以使用Xcode来开发您的服务器应用程序! 虽然Linux上的Foundation是iOS和macOS上的一个子集,但您可以在Xcode中完成大部分开发工作。 这使您可以访问IDE中强大的调试功能,这是大多数服务器端语言所没有的功能。
Vapor和服务器端Swift生态系统¶
Vapor已成为主要的高级服务器端Swift框架,其开发人员与Swift服务器工作组 (SSWG) 密切合作。SSWG是一个指导团队,旨在促进在服务器上使用Swift。它由来自Apple和社区的工程师组成,包括Vapor核心团队。
SSWG还针对构建在 SwiftNIO之上的推荐项目(例如PostgreSQL驱动程序和指标库)提供孵化过程。 因为Vapor也是构建在SwiftNIO之上的,所以您可以将这些包中的任何一个与您的服务器端Swift应用程序一起使用。 其中许多项目已经集成到Vapor中!
最后,Vapor拥有一个非常活跃和充满活力的社区,我们鼓励您参与其中!