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 アプリプロジェクトに組み込んで動作を確認してみる。
- Carthage で必要なパッケージの導入(CocoaPods でも可)
- 生成したファイルの取り込み
- 動かす
ざっくりこんなところだろうか。
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
その他
追記されてる!