リクエストボディを使う

api.py
コマンド「uvicorn api:app –reload」で起動

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class User(BaseModel):
    name: str


@app.post("/")
def read_item(user: User):
    return {"I am ": user.name}

コンソールで実行するコマンド

let param = {
    method: 'POST', 
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({name:"hello"})
}
let res = await fetch("http://localhost:8000/", param)
await res.json()

応答

{"I am ": 'hello'}

エラーが発生する例

Content-Typeを指定していない場合

let param = {
    method: 'POST', 
    body: JSON.stringify({name:"hello"})
}
let res = await fetch("http://localhost:8000/", param)
await res.json()

JSON.stringifyをしていない場合

let param = {
    method: 'POST', 
    headers: {'Content-Type': 'application/json'},
}
let res = await fetch("http://localhost:8000/", param)
await res.json()

ブラウザ側のエラー
POST http://localhost:8000/ 422 (Unprocessable Entity)

FastApi側のエラー
INFO: 127.0.0.1:64887 - “POST / HTTP/1.1” 422 Unprocessable Entity

GETでリクエストボディを使用しても起動できる(きっとよくない)

api.py

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class User(BaseModel):
    name: str


@app.get("/")
def read_item(user: User):
    return {"I am ": user.name}

curlの実行結果

aaa@DESKTOP-25861K3:~$ curl -X 'GET' 'http://172.23.240.1:8000' \
> -H 'accept: application/json' \
> -H 'Content-Type: application/json' \
> -d '{"name": "happy"}'
{"I am ":"happy"}

しかし、ブラウザからfetchしようとするとUncaught TypeError: Failed to execute ‘fetch’ on ‘Window’: Request with GET/HEAD method cannot have body.がでる。

アドレスとポート番号を変更する

api.py

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def test():
    return "test"


uvicorn.run(app, host="0.0.0.0", port=8000)

この場合は、「python api.py」のコマンドを使用