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
その他
追記されてる!