Swiftで「サクッと使える」通信ライブラリ【RapidFire】

はじめに

業務でのアプリ開発で通信が必要な場合は、AlamofireやAPIKitもしくはURLSessionをラップした自前のライブラリ的なものを使っているかと思います。

私も業務ではAlamofireかAPIKitを使っています。

これらのライブラリは、URLSessionの煩雑さや、不足している機能を補ってくれる素晴らしいライブラリだと思うのですが、 プロトタイピング勉強がてらに書くコード(通信は必要だがメインではない)向けに、 もっとカジュアルに使える 通信ライブラリが欲しいなと思っていました。

今さら通信ライブラリっていうのも、いわゆる「車輪」な感じなのですが、「RetroFitのBulderみたく書けるとカッコいいかもしれない」とか「用途が違うので大御所とはかぶらない」という理由を見つけたので、思い切ってつくってみました。

RapidFire

できたのが こちらの RapidFire です。

こんな風に使います。

RapidFire(.get, "https://httpbin.org/get")
    .setCompletionHandler({ (response: RapidFire.Response) in
        switch response.result {
        case .success:
            print("success: \(response.statusCode): \(response.toDictionary())")
        case .failure:
            print("error: \(response.statusCode): \(response.error)")
        }
    })
    .fire()

詳しくは README を見ていただければと思いますが、メソッドチェーンでリクエストの設定を組み立てていきます。

対応している機能はこちらです。

  • GET / POST / PUT / PATCH / DELETE
  • URL / JSON Parameter Encoding
  • multipart/form-data
  • JSON to Array / JSON to Dictionary Helper Method

レスポンスは、URLSessionのData, URLResponse, Errorの他に、成功/失敗のEnumとステータスコードが返ってきます。

public enum Result {
    case success
    case failure
}

public var result:     Result
public var statusCode: Int?
public var data:       Data?
public var response:   URLResponse?
public var error:      Error?

また現状レスポンス形式としてはJSONが主流なので、

  • JSON to Dictionary
  • JSON to Array
  • JSON to String

の変換用ヘルパーメソッドも用意してあります。

サンプルのように書けば、サクッとレスポンスの中身を確認できます。

まとめ

Elegant(Alamofire)とも Type-safe(APIKit)とも 違いますが、 Easy to use な感じで、目論み通り「カジュアルに使える」ものができたと思っています。

プロトタイピングの他にもAPIマッシュアップが捗りそうでし、小難しいことを考えなくていい個人アプリの通信部分など、何かと活躍しそうなライブラリです。

また、久しぶりに素のURLSessionをさわって、その手間のかかり具合に改めてライブラリの有難みを感じた開発でした。

リンク

  • RapidFire : Easy to use networking library in Swift.

  • Alamofire : Elegant HTTP Networking in Swift

  • APIKit : Type-safe networking abstraction layer that associates request type with response type.

こぼれ話

開発途中に "Star" が付いて驚きました。Githubには上げていましが、ブランチは develop しかない状態だったので。