# Premiers pas avec FastAPI

Assez consommé : passons derrière le comptoir. Dans ce chapitre, on construit une API en Python avec **FastAPI**. C'est un framework « tout compris » : à partir de vos fonctions et de leurs types, il gère la validation des données (avec Pydantic) et génère tout seul le contrat OpenAPI et la documentation.

### Installation

On crée un dossier pour le projet et un **environnement virtuel** (`.venv`) : les bibliothèques s'installent dedans, pas dans le Python du système. Choisissez votre système.

**Windows (PowerShell)**

```powershell
mkdir mon-api; cd mon-api
py -m venv .venv
.venv\Scripts\Activate.ps1
pip install "fastapi[standard]"
```

<p class="callout warning">Si `Activate.ps1` est refusé (« l'exécution de scripts est désactivée »), lancez une fois `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`, puis réessayez. Dans l'invite de commandes classique (cmd), activez avec `.venv\Scripts\activate.bat`.</p>

**macOS**

```bash
mkdir mon-api && cd mon-api
python3 -m venv .venv
source .venv/bin/activate
pip install "fastapi[standard]"
```

<p class="callout warning">Si macOS propose d'installer les « outils de ligne de commande » au premier `python3`, acceptez, puis relancez la commande.</p>

**Linux**

```bash
mkdir mon-api && cd mon-api
python3 -m venv .venv
source .venv/bin/activate
pip install "fastapi[standard]"
```

<p class="callout warning">Sous Ubuntu/Debian, si `python3 -m venv` affiche « ensurepip is not available » : `sudo apt install python3-venv`, supprimez le dossier `.venv` raté (`rm -rf .venv`), puis recommencez.</p>

<p class="callout info">Une fois l'environnement activé, l'invite commence par `(.venv)`. Il faut le réactiver **dans chaque nouveau terminal**. Si `fastapi : commande introuvable`, ou si `pip` répond `externally-managed-environment`, c'est que l'environnement n'est pas activé.</p>

### Premier endpoint

```python
# main.py
from fastapi import FastAPI

app = FastAPI(title="Mon API")

@app.get("/v1/health")
def health():
    return {"status": "ok"}
```

### Lancer le serveur

```bash
# Sur le port 8000, redémarre à chaque modification du code
fastapi dev main.py
```

Et on teste, évidemment, avec curl :

```bash
curl -i http://localhost:8000/v1/health
```

```http
HTTP/1.1 200 OK
Content-Type: application/json

{"status":"ok"}
```

### Le bonus de FastAPI

Ouvrez [http://localhost:8000/docs](http://localhost:8000/docs) : FastAPI a déjà généré le contrat OpenAPI et une documentation Swagger UI. Le contrat brut est sur `/openapi.json`, et une version Redoc sur `/redoc`.

<p class="callout success">Ce contrat généré est pratique, mais il décrit ce que fait le code, pas ce que le client attend. Le vôtre, vous l'avez écrit avant le code… n'est-ce pas ?</p>