techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Swagger Codegen で自動生成したクライアントSDKを使う(iOS編)

Swagger Codegen で自動生成したクライアントSDKを使う(iOS編)

REST API 実装 - techium にて grape-swagger で作成した JSON 定義を元に Swagger UI で Web API 仕様書を作成したが、Swagger の定義ファイルを使ってクライアント(iOS, Android など 色々 ) のソースコードを生成することもできる。

Swagger Codegen _ API Development Tools _ Swagger

自作した Web API に対し、クライアントソースコードを吐き出して実際に通信してみる。(ドキドキ

自動生成

まずは Swagger Codegen の使い方から。

Java さえ入っていれば jar を落としてくれば使える。
Maven Repository_ io.swagger » swagger-codegen-cli

現時点では 2.2.3 が最新。

出力可能な言語の一覧を確認する。

$ java -jar swagger-codegen-cli-2.2.3.jar 
Available languages: [akka-scala, android, apache2, apex, aspnet5, aspnetcore, async-scala, bash, csharp, clojure, cwiki, cpprest, CsharpDotNet2, dart, elixir, eiffel, erlang-server, finch, flash, python-flask, go, go-server, groovy, haskell, jmeter, jaxrs-cxf-client, jaxrs-cxf, java, inflector, jaxrs-cxf-cdi, jaxrs-spec, jaxrs, msf4j, java-play-framework, jaxrs-resteasy-eap, jaxrs-resteasy, javascript, javascript-closure-angular, java-vertx, kotlin, lumen, nancyfx, nodejs-server, objc, perl, php, php-symfony, powershell, pistache-server, python, qt5cpp, rails5, restbed, ruby, scala, scalatra, silex-PHP, sinatra, slim, spring, dynamic-html, html2, html, swagger, swagger-yaml, swift4, swift3, swift, tizen, typescript-angular2, typescript-angular, typescript-fetch, typescript-jquery, typescript-node, undertow, ze-ph]

言語ごとの設定オプションは以下のように確認する。

$ java -jar swagger-codegen-cli-2.2.3.jar config-help -l swift

CONFIG OPTIONS
    sortParamsByRequiredFlag
        Sort method arguments to place required parameters before optional parameters. (Default: true)

    ensureUniqueParams
        Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true)

    allowUnicodeIdentifiers
        boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false)

    projectName
        Project name in Xcode

    responseAs
        Optionally use libraries to manage response.  Currently PromiseKit, RxSwift are available.

    unwrapRequired
        Treat 'required' properties in response as non-optional (which would crash the app if api returns null as opposed to required option specified in json schema

    podSource
        Source information used for Podspec

    podVersion
        Version used for Podspec

    podAuthors
        Authors used for Podspec

    podSocialMediaURL
        Social Media URL used for Podspec

    podDocsetURL
        Docset URL used for Podspec

    podLicense
        License used for Podspec

    podHomepage
        Homepage used for Podspec

    podSummary
        Summary used for Podspec

    podDescription
        Description used for Podspec

    podScreenshots
        Screenshots used for Podspec

    podDocumentationURL
        Documentation URL used for Podspec

    swiftUseApiNamespace
        Flag to make all the API classes inner-class of {{projectName}}API

    hideGenerationTimestamp
        hides the timestamp when files were generated (Default: true)

以下、今回生成時に使用したオプション。

Swagger Code Generator for swift3-RxSwift Raw

これだけで HTTP クライアント実装が出来上がるなんて驚きですよね。

これを使って動作を確認していく。

動作確認

ではこれを iOS アプリプロジェクトに組み込んで動作を確認してみる。

  1. Carthage で必要なパッケージの導入(CocoaPods でも可)
  2. 生成したファイルの取り込み
  3. 動かす

ざっくりこんなところだろうか。

Carthage については、swagger-codegen で生成したファイルの中に Cartfile が含まれている。
(podspec もある)

github "Alamofire/Alamofire" >= 3.1.0
github "ReactiveX/RxSwift" ~> 2.0

自プロジェクトで使用している Cartfile に追記して

$ carthage update

出来上がった .framework を取り込んだりといつも通り Carthage のやり方にしたがって。

次に必要なファイルの取り込み。

生成したファイルは以下のようになっている。

|--.gitignore
|--.swagger-codegen
|--.swagger-codegen-ignore
|  |--VERSION
|--Cartfile
|--SampleAppClient.podspec
|--SampleAppClient
|  |--Classes
|  |  |--Swaggers
|  |  |  |--APIHelper.swift
|  |  |  |--APIs
|  |  |  |--APIs.swift
|  |  |  |  |--FeedAPI.swift
|  |  |  |  |--MicropostsAPI.swift
|  |  |  |  |--RelationshipsAPI.swift
|  |  |  |  |--UsersAPI.swift
|  |  |  |--AlamofireImplementations.swift
|  |  |  |--Configuration.swift
|  |  |  |--Extensions.swift
|  |  |  |--Models
|  |  |  |--Models.swift
|  |  |  |  |--Micropost.swift
|  |  |  |  |--Picture.swift
|  |  |  |  |--User.swift

SampleAppClient ディレクトリ以下が実装ファイルとなるのでこれをプロジェクト内にコピーする。

これで使用準備は整ったので動作確認。

あらかじめ irb 等で取得しておいたトークンを設定して実行。

class SampleAppTests: XCTestCase {

    override func setUp() {
        super.setUp()
        SampleAppClientAPI.customHeaders["Authorization"]
            = "Bearer 4c80d22739c848bd1e95ff1e8f38c562e72570255fe465ca61779ae4f5bed47d"
    }

    func testSwagger() {
        let getMicropostsExpectation = expectation(description: "Get Microposts")

        FeedAPI.getApiV1Feed { (microposts, error) in
            print(microposts?.count ?? "nil microposts")
            if let microposts = microposts {
                for micropost in microposts {
                    print(micropost.userId ?? "nil userId")
                    print(micropost.content ?? "nil content")
                }
            }
            print(error ?? "nil error")
            getMicropostsExpectation.fulfill()
        }
        waitForExpectations(timeout: 15.0, handler: nil)
    }

}

無事にフィードが取得できた。

今回のお試し実装は以下に。

kfurue/rails-tutorial-ios at scodegen-trial

その他

OAuth 2.0

追記されてる!