夏休みの思い出にVaporでAPIを作ってみた
Qiita Pocketという先日リリースした自作iOSアプリで、どうしてもアプリ用のAPIが必要になり、Server-Side-Swift(以降、SSS)フレームワークのVaporを使ってみました。
SSS楽しいよ!というお話しです。
自作APIが必要になった経緯
もともとの自作iOSアプリ要件はこんな感じでした。
- Qiitaの投稿のストック数ランキングが見れる
- 週間ランキングが見れる
- 月間ランキングが見れる
- タグでフィルタしたランキングが見れる
API実装前のアプリは、アプリだけ作ってQiitaから提供されているAPIをコールしてストック数を元にランキングを生成するだけでした。
なので、月間のランキングをその場で取得しようとすると時間がかかりすぎて3.の要件を断念していました。
また、旧アプリはAPIのv1を使っていたのですが、Qiitaからv1のAPIサポートが9月に終了する通告があり、v2に切り替えたところ、1APIで取得できた投稿のストック数が2API(投稿取得->投稿のストック数取得)コールせねば取れず、、
よし。API層作るしかねぇと思い、APIを作ることにしました。
(まだ開発中ですが、リポジトリはこちら)
なぜVapor ?
もともとSwiftは書けるけど、サーバーサイドは過去にFuelPHPを少し触ったのとProgateでRailsの講座を終えた程度の初心者だったので、この際何やっても同じなら慣れた言語のSwiftでやってみようと決断。
SSSのフレームワークは、PerfectとVaporのスター数が拮抗しているのですが、VaporはToolboxというコマンドセットでHerokuへのデプロイが可能なので、Vaporにしました。(環境の構築にお金と時間をかけたくなかった)
実装した機能
- DB作成(sqlite3)
- Model作成
- Modelの1対多のリレーション
- ルーティング
- Qiita APIにHTTPリクエスト
- Rate Limitを超えないようにインターバルを空けてリクエスト
- Modelに対してクエリの発行 (タグでフィルタ, 期間でフィルタ)
- ModelをJSONエンコード
- herokuにデプロイ
Vaporの良いところ
ほとんどの機能がデフォルトのパッケージで実装可能
実際、上記の実装のうち、追加のパッケージが必要だったのは「6. Rate Limitを超えないようにインターバルを空けてリクエスト」くらいでした。パッケージの選定に悩まなくて良く、かつ標準のパッケージの出来が良いのは素敵でした。
Swiftで書ける
これは当たり前ですが、Swiftの良いところを生かしてコードが書けるようにフレームワーク自体が設計されてます。
例えばModelオブジェクトのコード
final class Article: Model {
var storage: Storage = Storage()
static let idType: IdentifierType = .int
let title: String
let itemID: String
let publishedAt: Date
let profileImageURL: String
let url: String
var stockCount: Int = 0
var tags: Children<Article, Tag> {
return children()
}
// 中略extension Article: Preparation {
static func prepare(_ database: Database) throws {
try database.create(self) { (builder: Creator) in
builder.id()
builder.string(Article.title_key)
builder.string(Article.itemID_key)
builder.string(Article.publishedAt_key)
builder.string(Article.profileImageURL_key)
builder.string(Article.url_key)
builder.string(Article.stockCount_key)
}
}
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
```
DBの構築にはPreparationプロトコルが用意されており、それに準拠する必要があるので、コードに一貫性を保つことができます。
あと、extensionでプロトコル(=役割)ごとにコードをブロックで分割できるので、あとで見たときに大枠が掴みやすいです。
型
Vaporで用意されているメソッドは、エラーをthrowするよう設計されており、何と言っても型の情報が存在するのが嬉しいところです。swiftの強力なパターンマッチングを使えるのも嬉しい
XCodeで開発できる

慣れたエディタで開発できるので、iOS開発者としては嬉しいと思います。
cmd + Rしたら、webサーバーが立ち上がるのはちょっと感動しましたw
用途に応じたテンプレートを元に開発できる
frameworkを使うときに、フォルダ構成は?標準的な書き方は?
など色々調べないといけないですが、Vaporには充実したドキュメンテーションはもちろん、コマンドでプロジェクトを初期化する際、サンプルコード付きのテンプレートが生成できるので、それベースで開発できて便利です。
// APIを作るときのテンプレートはこんな感じ
vapor new <project name> — template=api herokuへのデプロイが簡単
初herokuでしたが、アカウント作ったあと、2コマンドで終わりました。対話形式で設定ができます
vapor heroku init
.. 対話形式で設定
vapor heroku push参考情報
まだネットの情報は少ないです。大体が英語の記事になるかと思います。公式のドキュメントとサンプルが充実しているので、そこを読めば大体大丈夫かと思います
公式ドキュメント
Vaporで作ったプロジェクト一覧
まとめ
SSSを初めて使ってみた印象ですが、始める前の心理的障壁が高かっただけで、思っていたほど難しくありませんでした(自作APIレベルですが)
サーバーサイド書ける人がSwiftを学びたいときも、UIKitなどiOS関連の知識なしで純粋にSwiftを学べるのでオススメです。
初めてのMedium
今まではてなブログで記事を書いていたのですが、Mediumに移行しました
