ARCHIVE

全部文章

75 篇文章
Vapor 从0开始:用 Swift 写后端与网站的完整教程 封面
Vapor 教程

Vapor 从 0 开始:系列总览

用纯 Swift 基于 SwiftNIO 写后端与网站,从环境搭建、路由、数据库 CRUD 到部署一站打通。

路由与请求处理 封面
路由

路由与请求处理

GET/POST、路径参数、接收与返回 JSON,以及新手常踩的坑。

控制器与 MVC 架构 封面
架构

控制器与 MVC 架构

用 RouteCollection 把零散路由收拢成模块,RouteGroup 统一管理前缀。

开发环境准备 封面
Vapor 大型教程

开发环境准备

动手写第一行 Vapor 代码前,先把开发环境搭好。本文带你分别在 macOS 和 Ubuntu 上安装 Swift 与 Vapor 工具箱,并配置顺手的编辑器。

Vapor 工具箱能力 封面
Vapor 大型教程

Vapor 工具箱能力

Vapor 工具箱(Toolbox)是一把瑞士军刀。本文带你认识它的常用命令,并用 vapor new 创建、运行你的第一个 Vapor 项目。

添加路由 封面
Vapor 大型教程

添加路由

路由是「请求地址」和「处理代码」之间的桥梁。本文讲解什么是路由,并动手在 routes.swift 里添加几个 GET 路由。

HTTP 基础 封面
Vapor 大型教程

HTTP 基础

写 Web 服务绕不开 HTTP。本文梳理 HTTP 协议的核心概念:请求与响应的结构、常用方法、状态码分类,为后续写接口打基础。

返回 JSON 数据 封面
Vapor 大型教程

返回 JSON 数据

现代接口大多返回 JSON。本文用 Vapor 的 Content 协议,让结构体自动编成 JSON,并通过一个 POST 路由把数据原样返回。

接收客户端数据 封面
Vapor 大型教程

接收客户端数据

接口不只是返回数据,还要能收数据。本文用 Vapor 的 Content 协议从 POST 请求中解码 JSON,拿到客户端传来的字段。

异步与 Future 封面
Vapor 大型教程

异步与 Future

Vapor 的异步模型初学容易发懵。本文用四个请求的例子讲清「异步非阻塞 IO」,并介绍 Future / Promise 及常用操作,帮你跨过这道坎。

SwiftNIO 原理 封面
Vapor 大型教程

SwiftNIO 原理

Vapor 跑在 SwiftNIO 之上。本文带你俯瞰 SwiftNIO 的架构:事件循环、Channel 流水线、Bootstrap、ByteBuffer,以及 Promise/Future 的协作方式。

控制器与 RouteCollection 封面
Vapor 大型教程

控制器与 RouteCollection

当项目变大、路由越来越多时,一条条手写 router 会难以维护。本文教你用控制器(Controller)把零散路由组织成独立模块,让代码清晰、好维护。

配置数据库 封面
Vapor 大型教程

配置数据库

Vapor 3 原生支持 SQLite、MySQL、PostgreSQL 三种关系型数据库。本文带你认识它们,并学会用 configure.swift 把 SQLite 配起来开始开发。

Fluent 模型持久化 封面
Vapor 大型教程

Fluent 模型持久化

Fluent 是 Vapor 3 里的 ORM(对象关系映射)。本文带你定义第一个数据模型 Acronym,并让它通过 Migration 自动建表、持久化到数据库。

数据库 CRUD 操作 封面
Vapor 大型教程

数据库 CRUD 操作

RESTful API 提供了一套用 URL + HTTP 方法调用 CRUD 的标准方式。本文用 Vapor 3 代码实现 Acronym 的增、查、改、删四个接口。

Fluent 查询 封面
Vapor 大型教程

Fluent 查询

除了简单的 all() / first(),Fluent 还能做条件过滤、或查询、取首条和排序。本文给出 Vapor 3 写法下的常用查询代码示例。

数据库种子数据 封面
Vapor 大型教程

数据库种子数据

当所有写接口都被认证保护后,刚建好的空库却连第一个用户都创建不了。本文教你用 Migration 在初始化时播下一个管理员账号。

父子关系(外键) 封面
Vapor 大型教程

父子关系(外键)

父子关系描述一对一或一对多,例如一个人可以有多个宠物、一个宠物只能有一个主人。本文用 Vapor 3 的外键方式实现它,并加上外键约束。

兄弟关系(多对多) 封面
Vapor 大型教程

兄弟关系(多对多)

兄弟关系就是多对多。本文用一张 Pivot(支点)表记录缩略语与类别的对应关系,并在 Vapor 3 中实现关联、解除和双向查询。

用户认证概述 封面
Vapor 大型教程

用户认证概述

认证是确认“你是谁”的过程。本文带你给 TIL 应用加上密码哈希、用户名唯一约束,并让接口在返回时不再泄露密码。

Basic 认证 封面
Vapor 大型教程

Basic 认证

本文给创建缩略语的接口加上 HTTP Basic 认证,只有带上正确“用户名 + 密码”的请求才能通过。

Token 认证 封面
Vapor 大型教程

Token 认证

Basic 认证后只有登录用户能创建缩略语,但其它请求每次都传密码太麻烦。本文让用户登录一次换取 token,之后请求只带 token 即可。

为认证更新测试用例 封面
Vapor 大型教程

为认证更新测试用例

接口加上认证后,原本的单元测试会全部失败。本文更新测试辅助方法和用例,让带 token 的请求也能被自动化测试覆盖。

构建 REST API 封面
Vapor 大型教程

构建 REST API

用 REST 风格把“增删改查”映射成统一的 URL 与 HTTP 方法,客户端对接起来更省心、也更规范。

API 模板与约定 封面
Vapor 大型教程

API 模板与约定

本文拆解 Vapor 模板工程,弄清楚 Package.swift、Sources、Tests 各自代表什么,以及程序到底从哪里启动。

工程结构 封面
Vapor 大型教程

工程结构

上一节用 vapor new 以通用 api 模板创建了 HelloVapor 项目。本文看一下模板项目的目录结构,理解功能模块是如何划分的。

切换到 PostgreSQL 封面
Vapor 大型教程

切换到 PostgreSQL

之前为了方便一直用基于文件的 SQLite,但它不支持外键约束。本文用 Docker 起 PostgreSQL,并在工程里改接 FluentPostgreSQL,验证外键约束真正生效。

测试基础 封面
Vapor 大型教程

测试基础

本文带你从零给 Vapor 3 项目加上单元测试:用 SPM 测试目标跑接口、区分测试数据库、并在每次运行前重置数据库,让你的 API 改动安心落地。

测试进阶与重构 封面
Vapor 大型教程

测试进阶与重构

一个测试函数把所有逻辑堆在一起不易复用。本文把建应用、重置数据库、发请求、解析响应等重复逻辑抽成扩展,再配合 setUp/tearDown,让测试代码清爽可维护。

常见错误排查 封面
Vapor 大型教程

常见错误排查

遇到诡异编译错误、找不到文件或配置错乱?本文给出几条实用的 Vapor 排错与清理命令,必要时再去社区求助。

其它测试用例 封面
Vapor 大型教程

其它测试用例

前面只写了一个用例,这里再多写几个练手:通过 API 新增用户、按 id 取单个用户,以及测试 User/Acronym、Acronym/Category 之间的关联。

在 Linux 上测试 封面
Vapor 大型教程

在 Linux 上测试

部署到 Linux 与本地 Mac 的 Foundation 实现不同,必须保证在 Linux 上也能跑通测试。本文讲 LinuxMain 手动登记测试用例,以及用 Docker 本地模拟 Linux 跑全套。

部署到私有服务器 封面
Vapor 大型教程

部署到私有服务器

不想依赖第三方平台?本文教你在自己的 Ubuntu 云服务器上用 Docker 跑起 PostgreSQL,再用 nginx 做端口转发,把 Vapor 3 应用部署上线。

部署到 Vapor Cloud 封面
Vapor 大型教程

部署到 Vapor Cloud

一条命令把 Vapor 3 项目推上云。本文展示 vapor cloud deploy 的完整部署流程,以及如何取消部署并清理资源。

Leaf 模板引擎 封面
Vapor 大型教程

Leaf 模板引擎

接口返回 JSON 是给前端 App 用的;但要做一个人人能直接打开的网站,得返回 HTML。Leaf 就是 Vapor 自带的模板语言:把变量塞进页面,动态生成最终 HTML。

中间件 封面
Vapor 大型教程

中间件

中间件夹在「客户端请求」和「服务端响应」中间,能在请求到达路由前、响应返回浏览器前做各种处理。本文先认识 Vapor 的几个内置中间件。

数据校验 封面
Vapor 大型教程

数据校验

表单提交的数据不一定靠谱。本文教你用 Vapor 3 的 Validatable 协议校验注册表单:既支持字段级规则,也能自定义「两次密码一致」这样的跨字段校验,并把错误提示回显到页面。

Cookie 与 Session 封面
Vapor 大型教程

Cookie 与 Session

网站要记住「你是谁」,靠的就是 Cookie 和 Session。本文用 Vapor 3 的 SessionMiddleware 实现登录与会话认证,并用 Cookie 确认提示和 CSRF Token 加固 Web 应用。

提供文件下载 封面
Vapor 大型教程

提供文件下载

网站离不开图片、样式表这些静态资源。本文用 Vapor 3 的 FileMiddleware 把 Public 目录变成文件服务根目录,轻松托管与下载文件。

数据库迁移 封面
Vapor 大型教程

数据库迁移

随着功能迭代,数据表结构也得跟着变。本文用 Vapor 3 的 Fluent 迁移,给 User 加 Twitter 字段、给 Category 加唯一约束,并按环境创建管理员账号。

美化页面 封面
Vapor 大型教程

美化页面

内容有了,页面还丑?本文用 Leaf 的模板嵌套复用骨架,再引入 Bootstrap,让 Vapor 3 的网站快速变美观、且移动端友好。

缓存 封面
Vapor 大型教程

缓存

缓存能让接口变快、少调外部 API。本文介绍 Vapor 3 的 KeyedCache 协议,以及内存缓存、数据库/Redis 缓存各自适合什么场景。

创建缩略语页面 封面
Vapor 大型教程

创建缩略语页面

本章我们在网站前端加上一个「创建缩略语」的网页:既有填写表单的页面,也有接收表单提交、把数据存进数据库的接口。

编辑缩略语页面 封面
Vapor 大型教程

编辑缩略语页面

本章学习如何给缩略语做「编辑」功能:用同一个表单页显示已有数据,提交后把改动写回数据库。

删除缩略语页面 封面
Vapor 大型教程

删除缩略语页面

本章用最简单的方式实现「删除缩略语」:受浏览器表单限制,用 POST 请求触发删除并跳回首页。

全部分类页 封面
Vapor 大型教程

全部分类页

本章实现网站上的「分类」相关页面:一个列出所有分类的列表页,以及点进去查看某分类下全部缩略语的详情页。

添加分类 封面
Vapor 大型教程

添加分类

本章给缩略语加上「分类标签」:先在模型层实现给缩略语挂分类的方法,再用 Select2 美化多选框,最后在创建与编辑时保存并同步分类。

全部用户页 封面
Vapor 大型教程

全部用户页

本章做一个「所有用户」的列表页,并在每个页面的导航栏里加上访问入口,方便随时查看。

用户主页 封面
Vapor 大型教程

用户主页

本章实现一个「用户主页」:展示用户的基本信息,并列出他创建的所有缩略语。

Google 登录 封面
Vapor 大型教程

Google 登录

有时用户不想每到一个网站都注册新账号,本章用 Vapor 3 配合 Imperial 接入 Google 的 OAuth 2.0,让用户用 Google 账号一键登录。

移动端(iOS)接入 封面
Vapor 大型教程

移动端(iOS)接入

Vapor 多数时候在讲服务端,但你的 App 总得有个客户端。这篇短文讲清楚 iOS 接入时最常被卡住的两道关:怎么放开 HTTP 明文请求、怎么信任自签 HTTPS 证书。