30
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

swagger 初めて触ってみた

Posted at

Serverless や、DevOps 周りのコードを書いていると、そこここで、Swagger という言葉を耳にする。ふわっと雰囲気だけわかるけど、実際触ったことなかったのでちょっとだけ、触ってみた。

Swaggerは、OpenAPI の世界最大のAPI 開発ツールのフレームワークらしい。これがあると、APIのライフサイクルをまたいで、デザインからドキュメント、テストから開発まで面倒をみてくれるようだ。

なぜ swagger に興味を持ったか?

Azure SDK for Go のコードに貢献しようと思ってコードを読んでいるときに

今後このリポジトリは、swagger ベースの自動生成に移行する。C# の Azure SDK はすでにそれで成功している

と書いてあった。Azure はしょっちゅう機能強化されているのでなるほど。という感じだ。ちなみに、Azure Rest API Specs参照のこと。

API のスペックがあると、ドキュメントから、ソースコード(クライアントとサーバー両方)を様々な言語で生成してくれる。ざっと、C# を見たら、ASP.NET や、ASP.NETCore まであった。これはきっと相当楽ちんだし、インターフェイスが共通化されるし、ドキュメントも生成されるし、いいことづくめじゃないか!

ともかく、コードを書いてなんか生成してみよう。

OpenAPI(Swagger) Specification を作成する。

オンラインでも Swagger エディタが使える様子。実際つかってみると、問題があるときにいろいろ怒られるのでいい感じ。

swagger01.png

実際にスペックを書いてみると、仕様 OpenAPI Specificationを読みながら書いてもなかなかエラーが消えない。なんでやねん!文法どおりやんけ!とおもったら、ポイントは最初だった。

openapi: 3.0.0

が、

swagger: "2.0"

になっていた。どちらも間違いではないが、Swagger のページでは、普通にアクセスすると、3.0 のページがでる。世の中のサンプルは、swagger: 2.0 が多いので、初めてだったので混乱してしまった。うまく出来てみると、図のように、プレビューで、API リファレンスが出来ていて見えるようになっている。いいね!ちなみに Visual Studio Code にも、プラグインがあった。

これもすごくいい感じ。

swagger02.png

コードを生成する。

さて、コードを生成する方法は、swagger-codegen-cli を使えば一発らしい。Homebrewや、JAR ファイル、Docker 等が提供されている。私は、Windows なので、さてどれでやるものかと思ったが、Docker がうまくいかなかったので、JAR ファイルを選択してみた。 JAR ファイルを、Bash on Windows の方で動かしてみよう。

まず jar をダウンロード

wget http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/2.2.3/swagger-codegen-cli-2.2.3.jar -O swagger-codegen-cli.jar

最初にめんどくさいので、.bashrc に、こんな雰囲気でエイリアスを書いておく。

alias swagger-codegen-cli='java -jar /home/ushio/Codes/swagger/swagger-codegen-cli-2.2.1.jar'

先ほどオンラインで作成した YAML ファイルを、swagger.yml という名前で保存して、実行する。うまくいかない。json のフォーマットにしたりして試してみるが、同じくうまくいかない。ファイルはちゃんとあるので、なんじゃそりゃ?という感じ。

$ swagger-codegen-cli generate -i swagger.json -l go
[main] INFO io.swagger.parser.Swagger20Parser - reading from swagger.json
[main] INFO io.swagger.parser.Swagger20Parser - reading from swagger.json
Exception in thread "main" java.lang.RuntimeException: missing swagger input or config!
        at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:132)
        at io.swagger.codegen.cmd.Generate.run(Generate.java:223)
        at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:36)

試行錯誤してわかったのだが、少なくとも私の試したバージョンの(2.2.3) ではだめだった。どうすればよかったかというと、swagger: 2.0 の方のAPI を使うと、ちゃんと生成された。多分次の 3.x で OpenAPI 3.0 対応になるのではと思われる。

Go

Client と、 Server の両方がしっかり生成されている。こりゃ楽だ!

swagger03.png

C#

こちらもがっつり生成されている。テストのテンプレートまで!ただ、Visual Studio 2017 で開こうとしたらバージョンが古そうではあったが、しかし、これぐらい生成されると嬉しい。サーバーとクライアントの両方がある。

swagger04.png

まとめ

無事、swagger の specification を作って、ドキュメントを観察して、コードを生成するところまでは実験できた。OpenAPI 3.0の仕様だと、Authentication のところで、AccessToken にも対応しているようだ。対応言語もものすごく多い!

API clients: ActionScript, Apex, Bash, C# (.net 2.0, 4.0 or later), C++ (cpprest, Qt5, Tizen), Clojure, Dart, Elixir, Eiffel, Go, Groovy, Haskell, Java (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx), Kotlin, Lua, Node.js (ES5, ES6, AngularJS with Google Closure Compiler annotations) Objective-C, Perl, PHP, PowerShell, Python, Ruby, Rust, Scala, Swift (2.x, 3.x, 4.x), Typescript (Angular1.x, Angular2.x, Fetch, jQuery, Node)
Server stubs: C# (ASP.NET Core, NancyFx), C++ (Pistache, Restbed), Erlang, Go, Haskell, Java (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework), PHP (Lumen, Slim, Silex, Symfony, Zend Expressive), Python (Flask), NodeJS, Ruby (Sinatra, Rails5), Scala (Finch, Scalatra)

Get started with API Apps, ASP.NET, and Swagger in Azure App Service こんなページも見つけた。確かにこれは、今後必須ですね!

リソース

30
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?