Swaggerの概要をまとめてみた。

<img width="1440" alt="スクリーンショット 2017-08-16 0.10.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/188446/c1711cea-524b-0914-2cfb-ceac6f9a93eb.png">

# 概要
最近は API Blueprint で仕様書を書くことが多かったのですが、Swagger が世界標準になるかもしれない、ということもあり、開発の効率化を進めるためにも概要をまとめてみようと思った次第です。

# Swaggerとは
Swagger は RESTful APIを構築するためのオープンソースのフレームワークのことです。「Open API Initiative」という団体がRESTful APIのインターフェイスの記述をするための標準フォーマットを推進していて、その標準フォーマットがSwaggerです。Swaggerには多くの便利なツールが提供されていることもあり、多くのメリットを享受できそうです。

Swagger Spec を書いておけば自動的にドキュメント生成までしてくれ、それだけではなく、ドキュメントから実際のリクエストを投げられる優れものです。


# Swaggerのツール群

|ツール|説明|
|:-------------|:-----------------|
|[Swagger Spec](https://swagger.io/specification/)|REST APIに対して Swagger の仕様に準じたドキュメント|
|[Swagger Editer](https://swagger.io/swagger-editor/)|Swagger Spec の設計書を記載するためのエディタ|
|[Swagger UI](https://swagger.io/swagger-ui/)|Swagger Spec で記載された設計からドキュメントをHTML形式で自動生成するツール|
|[Swagger Codegen](https://swagger.io/swagger-codegen/)|Swagger Spec で記載された設計からAPIのスタブを自動生成|

Swagger で利用できるツールはここに記載した他、サードパーティ製も豊富です。この記事では、Swagger Spec、Swagger Editer、Swagger UI の3つに触れたいと思います。

## Swagger Spec

Swagger Spec はSwaggerの書式で記述した仕様書です。JSONもしくはYAML形式で記述します。Excelなどでの管理と比較するとテキストベースなのでバージョン管理が容易です。以下に記述例を紹介します。

### Swagger Spec 記述サンプル

```
swagger: '2.0'

info:
  version: "1.0.0"
  title: タイトル

paths:
  /posts/{id}:
    get:
      description: |
        description
        説明文

      parameters:
        -
          name: id
          in: path
          description: Id of array
          required: true
          type: number
          format: double

      responses:
        200:
          description: Successful responses
          schema:
            title: ArrayOfPosts
            type: array
            items:
              title: Posts
              type: object
              properties:
                name:
                  type: string
                title:
                  type: string
                published:
                  type: boolean
                content:
                  type: string
```


##Swagger Editer

[Swagger Editer](http://editor.swagger.io/)は Swagger ファイルの生成や編集を行うためのツールです。ブラウザ上で動きます。左側にYAMLまたはJSONで記述します。右側には左の記述をもとに生成されたドキュメントです。リアルタイムにドキュメントが更新されるので構文チェックを行うこともできます。またこの画面からAPIの実行も可能です。

<img width="1672" alt="スクリーンショット 2017-08-16 0.12.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/188446/e8ec9281-ccaf-76b6-3f30-1149e390e656.png">

キャプチャーは、YAMLを元に生成されたドキュメントが表示されている様子です。

## Swagger UI

Swagger UIは Swagger-Specを読み込んで、HTML形式でドキュメントを生成するためのツールです。

![スクリーンショット 2017-08-25 16.47.56.png](https://qiita-image-store.s3.amazonaws.com/0/188446/c0ba0d31-ea3e-92eb-d21c-8ab161ec9daf.png)

Swagger UI を手っ取り早く利用するため、Swagger Editer の Generate Server から　nodejs-server を選択します。選択すると、zipファイルがダウンロードされるので以下のコマンドで実行します。

```
$ cd nodejs-server-server
$ npm install
$ node index.js
Your server is listening on port 8080 (http://localhost:8080)
Swagger-ui is available on http://localhost:8080/docs
```
http://localhost:8080/docs にアクセスするとSwagger UI を利用できます。

![スクリーンショット 2017-08-25 16.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/188446/e5a94f1a-af1c-55f2-3498-ff8c4e744aa6.png)

うまくいくとキャプチャのような感じになります。

## Swagger Codegen

Swagger Codegen については~~今回は詳しく触れませんが、次回記事にまとめようと思います。~~

こちらの記事をご覧ください。
[Swaggerの概要をまとめてみた。【Swagger Codegen編】](https://qiita.com/gcyata/items/ae9e931a2d09b6be209e#_reference-61fa70e7be990e641135)

# Swagger を調べて感じたこと、まとめ

普段の業務では [API Blueprint](https://apiblueprint.org/) で仕様を書くことが多かったのですが、API Blueprint はMarkdownで記述します。ドキュメントを動かすには Aglio を使えば非常にスムーズに使えます。一方、Swagger　はその拡張性ゆえに覚えるのが大変だなと感じます。何でもできるツールはそのぶん学習コストが高くなりがちです。

APIドキュメントジェネレータを選ぶ際、重要になるのはそれぞれのドキュメントジェネレータが持つツールの使いやすさだと思います。そういったことを踏まえると Swagger はツール群がサードパーティ製を含めると豊富にあり、どれを使おうか迷ってしまいます。逆にそうした関連するツールが少なければ迷う場面は少なくなると思います。Swagger はその時々によって最適なものを選択できれば非常に便利であることは確かです。


# 参考記事

- [SwaggerでRESTful APIの管理を楽にする](http://qiita.com/disc99/items/37228f5d687ad2969aa2)
- [Swaggerの便利ツールまとめ](https://developer.ntt.com/ja/blog/c446d3f6-670d-4ba6-b589-5ec00600b95f)