'How to post JSON data to FastAPI backend without using Swagger UI?
I am trying to do a simple POST
operation using FastAPI. I have created a basic structure using BaseModel
, which has only two attributes, namely 'name' and 'roll'.
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
roll: int
app = FastAPI()
@app.post("/")
async def create_item(item: Item):
return item
if __name__ == '__main__':
uvicorn.run(app, port=8080, host='0.0.0.0')
I would like to post these data using this POST
operation -
{"name":"XYZ", "roll":51}
I know about the automatic documentation at http://localhost:8080/docs
provided by Swagger UI (OpenAPI), which we can use to post data. But I wouldn't want to use it. What I would like is to directly post the data using the URL http://localhost:8080/
and would like to see the result in the browser itself, instead of seeing the result in Swaggger UI.
Solution 1:[1]
You would need to use a Javascript interface/library, such as Fetch API, that allows you to send data in JSON
format. Example is given below. For submiting Form
data, have a look at this answer, while for posting both Files
and Form
/JSON
data, have a look here.
You can use Jinja2Templates
to render and return a TemplateResponse
that includes your HTML/JS code.
app.py
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
app = FastAPI()
templates = Jinja2Templates(directory="templates")
class Item(BaseModel):
name: str
roll: int
@app.post("/")
async def create_item(item: Item):
return item
@app.get("/")
async def index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
You can use an HTML form
to submit your data and then have the form
data converted into JSON
, as described here. Otherwise, you could post your JSON
data directly, as shown here,; for example, body: JSON.stringify({name: "foo", roll: 1})
.
templates/index.html
<html>
<head>
<script type="text/javascript">
function submitForm() {
var formElement = document.getElementById('myForm');
var data = new FormData(formElement);
fetch('/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(Object.fromEntries(data))
})
.then(response => response.text())
.then(data => {
document.getElementById("responseArea").innerHTML = data;
})
.catch(error => {
console.error(error);
});
}
</script>
</head>
<body>
<h1>Post JSON Data</h1>
<form method="post" id="myForm">
name : <input type="text" name="name" value="foo">
roll : <input type="number" name="roll" value=1>
<input type="button" value="Submit" onclick="submitForm()">
</form>
<div id="responseArea"></div>
</body>
</html>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |