リクエストボディを使う
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」のコマンドを使用