第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
规范定义了以下方法:
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
最常见的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
拥有一个非常活跃和充满活力的社区,我们鼓励您参与其中!