REST APIをFastAPIで実装しデプロイ

# はじめに
以下の3つのいずれかに当てはまる方を対象として書いています。
1. REST APIについて知らない
1. FastAPIを触ったことがない
1. FastAPIで作ったものを公開したい

# ゴール
本記事のゴールは「はじめに」で説明した3点について理解することです。

# APIとは
"Application Programming Interface"の略
APIは何かしらのリクエストに対して、レスポンスを返すものです。
GoogleMapAPIでは、位置情報(緯度、経度)を渡すと、その周辺の位置情報を返してくれます。
ホットペッパーグルメのAPIでは、位置情報を渡すと、その周辺のお店の情報を返してくれます。

APIっていうのは主にクライアント(ブラウザ)とバックエンド(サーバ)との通信に用いられます。その『通信』にはいろんなルールがあって、それぞれにメリットデメリットがあります。
- REST API
- GraphQL
- gRPC

# REST APIとは
"Representational State Transfer"
以下の4つの基本原則を満たしたものをREST,RESTfulと言います。設計思想の1つだと思ってください。
1. 統一インターフェース
1. アドレス可能性
1. 接続性
1. ステートレス性
</br>
統一インターフェースっていうのは、次章でまとめたHTTPっていうやり方で通信をする。
通信するデータはJSON形式にする。っていうのがRESTAPIの基本です。

# HTTPメソッド
webアプリの基本は、データに対してCRUDと呼ばれる4つの操作を行うことになります。
そのCRUD操作は、予め決められたHTTPっていう通信方法で行います。その方法のことをメソッドと言います。代表的なHTTPメソッドは以下です。
1. GET (Read：データ取得)
2. POST (Create：データ登録,更新)
3. PUT (Update：データの変更)
4. DELETE (Delete：データの削除)


# FAST APIとは
- バックエンドAPIを作成するためのpythonのフレームワーク
pythonだと他にFlaskやDjangoRestFrameworkがあります。
- 高速に作れて、高速に動作する
- pydanticと組み合わせることで、バリデーションチェックを行ってくれる
- 自動でAPIドキュメントを生成し、手動テストすることができる
- ORM(データベースを操作するのを簡単にするツール)であるSQLAlchemyを用いることができる

```python
a: int
a = 3
s: str
s = "string"
```


上記のように型ヒントを用いることで、入力した値が型に一致するか判定できます。
例えばフロントエンドからバックエンドへデータを送る際のリクエストの型があっているか判定できます。
```main.py
from pydantic import BaseModel

class UserCreate(BaseModel):
    name: str
    age: int
```
上記のコードは、スキーマ定義といって、BaseModelを継承することで、自分で型を定義できます。
```main.py
@app.get("/user/")
def create_user(user: UserCreate)
#引数のuserが、UserCreateクラスのデータ型になるように縛っている
    new_user = ...
    return new_user
```

# FAST APIの環境構築
python3.6以上が必要になります。
```powershell
python --version
```

python3.6以上が入っていることを確認したら、以下の2つのライブラリをインストールします。
今回は **fastapi-test/** というディレクトリで進めます。
```powershell:fastapi-test/
pip install fastapi
pip install uvicorn
```
# FastAPIを起動
ライブラリのインストールが終わったら、main.pyというファイルを作成します。main.pyに以下を記述していきます。
```python fastapi-test/main.py
from fastapi import FastAPI #FastAPIをインポート

app = FastAPI() #FastAPIのインスタンス作成

@app.get("/") #getメソッドで"/"にアクセス
def hello():
    return {"message":"Hello World!"}
```
上記を書き終えたら保存し、powershell等で以下のコマンドを使ってサーバを起動させましょう。
```powershell:fastapi-test/
uvicorn main:app --reload
```
「--reload」をつけて置くことでmain.pyを書き換えた後自動でサーバを再起動してくれます。
ご自身のブラウザで「localhost:8000」と打ってアクセスしてみましょう。
「{"message":"Hello World!"}」と出力されたら成功です！
# FastAPIで簡単な機能実装
次はPOSTメソッドで数値を送り、その数値を掛け算して結果を返すAPI機能を作ってみます。
```python:fastapi-test/main.py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

@app.get("/")
def hello():
    return {"message":"Hello World!"}

@app.post("/")
def calc(x: int,y: int):
    z = x*y
    return {"result":z}

```
上記を記述できたら、localhost:8000に飛んでみましょう。
localhost:8000/docsと打つと、作成したAPIのドキュメントが自動で作られています。
**POST** / **Calc** という部分をクリックすると、「**Try it out**」というボタンがあるので押しましょう。
その後自分で作ったx,yという変数に数値を入力し**Execute**を押すとリクエストをテスト送信できます。
下の方にいくとレスポンス結果が見れます。
「Code」の下にある数値が200になっていれば成功です。Response bodyに{"result":45}などの数値でx*yの結果が返ってきていれば成功です。


# APIを公開

:::note warn
Deta Spaceというサービスは変化が激しいようです。2023年9月時点で作成していたDeta Spaceのアカウントでは下記の手法で問題なくデプロイができましたが、現在はDeveloper Modeの申請が必要になっているようです。
すぐにデプロイしたい方にはHeroku,Renderといったサービスをお勧めします。
:::

# Deta Spaceにデプロイ
Deta Spaceというサービスでアカウントを作成し、ログインします。
めちゃくちゃわかりやすいサイトがありましたので、参考にしてください。

https://qiita.com/kakiuchis/items/80f6239f6319066ee18d


main.pyと同階層に以下を記述したテキストファイルを入れておいてください。アップロードするサーバがこのテキストを読んでFastAPIをインストールして動ける状態にしてくれます。
```txt:fastapi-test/requirements.txt
fastapi
```
**Deta Space**にログインできたら、後は2つのコマンドを実行するだけです。
```powershell:fastapi-test
space new
```
spacefileというファイルが作成されるので、一番下に　**「public: true」**　と入れておいてください
```powershell:fastapi-test/Spacefile
# Spacefile Docs: https://go.deta.dev/docs/spacefile/v0
v: 0
micros:
  - name: deploy-api
    src: ./
    engine: python3.9
    primary: true
    public: true

```
下記コマンドでサーバにデプロイできます。
成功するとURLが表示されるので、URLをクリックすると作成したAPIにアクセスできます。
今後ソースコードを変更した際も、下記コマンド1発でサーバに変更を反映させることができます。
```powershell:fastapi-test
space push
```

# 参考記事・書籍

- FastAPI入門 
FastAPIをもっと詳しく知りたい方、Dockerを使って開発したい方、非同期処理をしてみたい方にお勧め

https://zenn.dev/sh0nk/books/537bb028709ab9

- 『WEBを支える技術』山本陽平.技術評論社.2010
RESTについて知りたい方、WEBの基礎について知りたい方にお勧め
- 『基礎から学ぶFastAPI実践入門』久保田公平.2021
本記事よりも詳しく、そしてわかりやすくFastAPIについて書かれてあり、手元で動かしながら学習できる書籍です。

- FastAPI公式ドキュメント

https://fastapi.tiangolo.com/

- SQLAlchemy公式ドキュメント

https://docs.sqlalchemy.org/en/20/


# 最後に
読んでくださりありがとうございました。
急ピッチで書いたので、至らぬ点が多いと思いますがご了承いただければ幸いです。
適宜加筆・修正も行って参りますので何かご要望・ご質問等ありましたらコメントをお願いします。