35 lines
789 B
Python
35 lines
789 B
Python
|
from typing import List
|
||
|
|
||
|
import yaml
|
||
|
from fastapi import FastAPI, HTTPException, Request
|
||
|
from pydantic import BaseModel, ValidationError
|
||
|
|
||
|
app = FastAPI()
|
||
|
|
||
|
|
||
|
class Item(BaseModel):
|
||
|
name: str
|
||
|
tags: List[str]
|
||
|
|
||
|
|
||
|
@app.post(
|
||
|
"/items/",
|
||
|
openapi_extra={
|
||
|
"requestBody": {
|
||
|
"content": {"application/x-yaml": {"schema": Item.schema()}},
|
||
|
"required": True,
|
||
|
},
|
||
|
},
|
||
|
)
|
||
|
async def create_item(request: Request):
|
||
|
raw_body = await request.body()
|
||
|
try:
|
||
|
data = yaml.safe_load(raw_body)
|
||
|
except yaml.YAMLError:
|
||
|
raise HTTPException(status_code=422, detail="Invalid YAML")
|
||
|
try:
|
||
|
item = Item.parse_obj(data)
|
||
|
except ValidationError as e:
|
||
|
raise HTTPException(status_code=422, detail=e.errors())
|
||
|
return item
|