OpenAPI 3.0 の使い方

こちらのページを参考にしました。
[作って理解する OpenAPI 3.0 / connexion](https://qiita.com/halhorn/items/e47673eecc4a01ffb3a0)

## 仕様を記述
>GET で http://localhost:8080/api/v0/health にアクセスするとリスポンスがある。

```yaml:ex02.yaml
openapi: 3.0.3
info:
  title: OpenAPI Tutorial
  description: OpenAPI Tutorial by halhorn
  version: 0.0.0
servers:
  - url: https://example.com/api/v0
    description: プロダクション API
  - url: http://{host}:{port}/api/v0
    description: 開発用
    variables:
      host:
        default: localhost
      port:
        default: '10080'
paths:
  /health:
    get:
      operationId: openapitutorial.controller.health.call
      summary: サーバーの状態を返します
      description: サーバーの状態を返します。
      responses:
        '200':
          description: サーバーは正常に動作しています
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/get_health_response'
components:
  schemas:
    get_health_response:
      description: サーバーの状態のレスポンス
      type: object
      properties:
        status:
          type: string
          enum:
            - ok
      required:
        - status
```

https://editor.swagger.io/ でバリデート

![openapi_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3608f8c9-a520-7acb-b471-229bcbd7a426.png)

## JSON に変換
>この工程は必要というわけではありません。

File -> convert and save as JSON

```json:openapi.json
{
  "openapi": "3.0.3",
  "info": {
    "title": "OpenAPI Tutorial",
    "description": "OpenAPI Tutorial by halhorn",
    "version": "0.0.0"
  },
  "servers": [
    {
      "url": "https://example.com/api/v0",
      "description": "プロダクション API"
    },
    {
      "url": "http://{host}:{port}/api/v0",
      "description": "開発用",
      "variables": {
        "host": {
          "default": "localhost"
        },
        "port": {
          "default": "10080"
        }
      }
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "operationId": "openapitutorial.controller.health.call",
        "summary": "サーバーの状態を返します",
        "description": "サーバーの状態を返します。",
        "responses": {
          "200": {
            "description": "サーバーは正常に動作しています",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/get_health_response"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "get_health_response": {
        "description": "サーバーの状態のレスポンス",
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok"
            ]
          }
        },
        "required": [
          "status"
        ]
      }
    }
  }
}
```

## Flask のサーバーを作成

Generate Server -> python-flask

python-flask-server-generated.zip が出来る

解凍

```bash
unzip python-flask-server-generated.zip
```

ライブラリーのインストール

```bash
pip3 install -r requirements.txt
```

## サーバーの実行

```bash
python3 -m swagger_server
```

## クライアントでアクセス

```text
$ http http://0.0.0.0:8080/api/v0/health
HTTP/1.1 200 OK
Connection: close
Content-Length: 17
Content-Type: application/json
Date: Sun, 09 Apr 2023 08:24:17 GMT
Server: Werkzeug/2.2.3 Python/3.10.10

"do some magic!"
```

## 関連ページ
[OpenAPI 3.0 の使い方 (GET 引数付き）](https://qiita.com/ekzemplaro/items/fffea0f0b2313ebe1b65)
[OpenAPI 3.0 の使い方 (POST 引数付き）](https://qiita.com/ekzemplaro/items/30b2e096535823f132a2)