Fast APIでWebAPIを作ってみる①

## FastAPIを使って、WebAPIを作ってみます。

### せっかくkubernetesの環境を作ったので、その上で動かせるものを作ってみようと思い立ち、FastAPIを使って、WebAPIを作っていこうと思います。


## 開発環境
　　|バージョン
---|---
Python|3.10.4
FastAPI|0.78.0
Uvicorn|0.18.1
Docker|20.10.16

## 今回のお題
今回は
　①FastAPIを使って簡単なAPIの作成
　②dockerfileの作成
　③docker-composeの作成
　④FastAPIでrouterの設定
辺りまでを実装していきます。

## 実装
### フォルダ構成は以下の通りです。
┣━backend/
┃　　┣━app
┃　　┃　┣━api
┃　　┃　┃　┗━routes
┃　　┃　┗━core
┃　　┣━Dockerfile
┃　　┗━requirements.txt
┗━docker-compose.yml

### ①FastAPIを使って簡単なAPIの作成
最初は、main.pyを作成していきます。
main.pyを作成する場所は、appフォルダの配下となります。

```main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.routes.routes import router

app = FastAPI(title="IncidentManagement",version="0.0.1")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    # cookieの共有を行う設定（defaultはFalse）
    allow_credentials=True,
    # 許可するHTTPメソッドを指定する。（defaultはGET）
    allow_methods=["*"],
    # オリジン間リクエストでサポートするHTTPリクエストヘッダーのリストを指定する。
    # Accept、Accept-Language、Content-Language、Content-Typeヘッダーが常に許可される。
    allow_headers=["*"],
)
app.include_router(router,prefix="/api")

```
### ②dockerfileの作成
続いてDockerfileの作成です。
作成する場所は、backendフォルダの直下となります。
``` Dockerfile.
# pythonのTags名を指定。
FROM python:3.10.4-alpine
# 処理を実行するフォルダ名を指定。
WORKDIR /backend
# 実行環境にインストールする内容を記載したtxtファイルを実行フォルダにコピーする
COPY ./requirements.txt /backend/requirements.txt
# requirements.txtで記載したミドルウェアのインストールの実行
RUN set -eux \
    && apk add --no-cache build-base \
    && pip install --upgrade pip setuptools wheel \
    && pip install --no-cache-dir --trusted-host pypi.python.org -r /backend/requirements.txt \
    && apk del build-base 

COPY . /backend
```
### ③docker-composeの作成
docker-compose.ymlの作成となります。
作成する場所は、backendフォルダと同じ階層のフォルダに作成します。

```docker-compose.yml
version: '3.0'
services:
  server:
    build:
      context: ./backend
      dockerfile: Dockerfile
    volumes:
      - ./backend/:/backend/
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
    ports:
      - 8000:8000
```

### ④FastAPIでrouterの設定
JSON形式のデータを返すだけの簡単なControllerとなります。
```ma_compnayController.py
from typing import List
from fastapi import APIRouter

router = APIRouter()

@router.get("/all")
async def get_all_company():
    allcompanydata = [
        {"id":1,"company_cd":"0001","company_nm":"CompanyA"},
        {"id":2,"company_cd":"0002","company_nm":"CompanyB"}
    ]

    return allcompanydata
```

Routerの設定となります。
http://localhost/api/companys が叩かれたら、上記で作成したControllerを呼び出すように設定しています。
```routes.py
from fastapi import APIRouter
from app.api.routes import ma_compnayController

router = APIRouter()

router.include_router(ma_compnayController.router,prefix="/companys",tags=["macompany"])
```

### ここまで作成したら、一度dockerを起動してみようと思います。
```
$ docker-compose build
$ docker-compose up
```
コマンドに以下の様な内容が表示されたら正常にdockerが実行されたことになります。
```
$ docker-compose up
[+] Running 1/0
 - Container src-server-1  Created                                                                                                                                                                                   0.0s 
Attaching to src-server-1
src-server-1  | INFO:     Will watch for changes in these directories: ['/backend']
src-server-1  | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
src-server-1  | INFO:     Started reloader process [1] using StatReload
src-server-1  | INFO:     Started server process [8]
src-server-1  | INFO:     Waiting for application startup.
src-server-1  | INFO:     Application startup complete.
```


この状態で、ブラウザから//localhost:8000を叩いてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/814d9b90-fee0-83a5-721c-f55183527db2.png)

当然、root上には処理を何も設定していないので、エラーが返ってきます。

では、次に、//localhost:8000/api/companys/allを叩いてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/4e5f01a1-4851-ca8d-29c3-fa38ee7df122.png)
正常にcontrollerに設定したjson形式の値が返ってきました。


今回はここまでとなります。
次回は、docker上にpostgresqlを作成し、そこにアクセスできるようにしたいと思います。

## 参考にしたサイト
https://nmomos.com/tips/2021/01/23/fastapi-docker-1/
https://fastapi.tiangolo.com/ja/