swagger-codegenを使ってpython-flaskのモックサーバーを秒で立てたい。

# はじめに
業務の中でWebサーバーなんぞ詳しくないのに、
PoC用にWebサーバーを立てろ(しかも秒で)と言われた経験がある方にswagger-codegenをご紹介します。
（秒では立てられないかもしれませんが、API仕様さえyamlで書ければ簡単にサーバーまで立てられます。）

# swagger-codegenについて
swagger-codegenはYAML(or JSON)でAPI仕様を定義すると、
そのAPI定義通りにモックサーバーを作り、
さらに、以下のようにそのAPIを叩けるブラウザUI画面を作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520396/bbc1fa69-9a6c-7111-1096-f81d88fc68c4.png)


# 使用環境
- OS ... Windows 10 Home(64bit)
- Python ... conda環境
- その他、JREが必要

# JREのインストール
JREがない場合は以下よりダウンロード＆インストールをする。
- https://www.java.com/ja/download/manual.jsp

# swagger-codegen-cli.jarの取得
mavenのレポジトリから取得する。
- https://repo1.maven.org/maven2/io/swagger/

今回は以下の2.4.15を使用した。
- https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.15

# API仕様をswagger.yamlに定義
API仕様を定義してあげると、その定義に沿ってモックサーバーができます。
以下のようなファイルをどこか適当に作成します。

```swagger.yaml
swagger: "2.0"
info:
  description: "これはペットストアに関するAPIです。"
  version: "1.0.0"
  title: "Petstore API"
  termsOfService: "http://swagger.io/terms/"
  contact:
    email: "apiteam@swagger.io"
  license:
    name: "Apache 2.0"
    url: "http://www.apache.org/licenses/LICENSE-2.0.html"
paths:
  /pet/{petId}:
    get:
      summary: "ペット情報API"
      description: "指定されたpetIdの情報を返します"
      parameters:
      - name: "petId"
        in: "path"
        description: "取得したいペットのID"
        required: true
        type: "integer"
        format: "int64"
      responses:
        200:
          description: "成功時のレスポンス"
          schema:
            type: "object"
            properties:
              id:
                type: "integer"
                format: "int64"
              name:
                type: "string"
                example: "doggie"
```

swagger.yml内の記述の意味は以下をご参考にしてください。
- https://qiita.com/rllllho/items/53a0023b32f4c0f8eabb

# モックサーバーを作成
今回は慣れ親しんだpythonを使いたいので、pytoh-flaskでモックサーバーを作成します。

```
> java -jar {ダウンロードしたjarファイル} generate -i swagger.yaml -l python-flask -o test-server
```

`-l`オプションを変えればGoでもNode.jsでもRuby on Railsでもなんでも作れます。
他に`-l`オプションに何があるかは以下を参考にしてください。
- https://github.com/swagger-api/swagger-codegen/wiki/Server-stub-generator-HOWTO

# 作成されたフォルダ構成
python-flaskの場合、こんな感じでモックサーバーができます。
Dockerfileもできていますので、Dockerコンテナにすることも可能です。

```
> tree server
server
├── Dockerfile
├── README.md
├── git_push.sh
├── requirements.txt
├── setup.py
├── swagger_server
│   ├── __init__.py
│   ├── __main__.py
│   ├── controllers
│   │   ├── __init__.py
│   │   └── default_controller.py
│   ├── encoder.py
│   ├── models
│   │   ├── __init__.py
│   │   ├── base_model_.py
│   │   └── inline_response200.py
│   ├── swagger
│   │   └── swagger.yaml
│   ├── test
│   │   ├── __init__.py
│   │   └── test_default_controller.py
│   └── util.py
├── test-requirements.txt
└── tox.ini
```

この中で、実際の処理を記載するのは、`default_controller.py`の`pet_pet_id_get`の部分になります。

```default_controller.py
import connexion
import six

from swagger_server.models.inline_response200 import InlineResponse200  # noqa: E501
from swagger_server import util


def pet_pet_id_get(petId):  # noqa: E501
    """ペット情報API

    指定されたpetIdの情報を返します # noqa: E501

    :param petId: 取得したいペットのID
    :type petId: int

    :rtype: InlineResponse200
    """
    return 'do some magic!'
```

# Windows上のconda環境で動かしてみる。
必要なパッケージをインストールします。
swagger-codegenによって作られた環境にはpipのrequirements.txtしか書いていませんが、
conda環境では以下をインストールすれば動かすことができます。

```
> conda install connexion
> conda install swagger-ui-bundle
```

起動します。

```
> cd test-server
> python -m swagger_server
```

以下にブラウザからアクセスして画面が見えたら起動できています。
- http://localhost:8080/ui/

以上、お疲れさまでした！