Ubuntu 20.04LTS, con Python 3.8 para FastAPI y Flutter 2.8.1, con Android SDK versión 32.0.0.
Estoy tratando de enviar un mapa de Flutter a FastAPI. Descubrí cómo POST, pero ¿cómo puedo recibirlo del lado de FastAPI?
¿Es necesaria la base de datos?
Lado de aleteo:
import 'src/models/keywords_model.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' show get, post; import 'dart:convert'; class SearchScreen extends StatefulWidget { const SearchScreen(List<KeywordsModel> keywords, {Key? key}) : super(key: key); @override _SearchScreenState createState() => _SearchScreenState(); } class _SearchScreenState extends State<SearchScreen> { final _formKey = GlobalKey<FormState>(); final List<String> keywords = []; final Map<String, dynamic> keywordsMap = {}; Future<void> postKeywords(parsedJson) async { await post(Uri.http("10.0.2.2:8000", "/search"), body: parsedJson); } @override Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( child: Icon(Icons.search), onPressed: () { print('---------------' * 20); for (int i = 0 ; i < keywords.length ; i++) { keywordsMap["$i"] = keywords[i]; } var parsedJson = json.encode(keywordsMap); postKeywords(parsedJson); }, ), /// Skipped many lines ); } }Lado FastAPI:
from fastapi import FastAPI import json app = FastAPI() @app.post("/search/") async def receive_keywords(): """What to Put Here?""" json.loads(?????)Tienes que usar Resonse o JsonResponse. debe definir un dictado o mapa y luego enviarlo envolviendo uno de los anteriores. Aquí te dejo el enlace por si quieres leer más. https://fastapi.tiangolo.com/advanced/response-directamente/
Si desea usar flutter como interfaz, realmente le recomiendo que use dio y retrofit para manejar la integración de la API. Y esos dos paquetes lo ayudarían a administrar y manejar fácilmente todos sus puntos finales de API. Tome la imagen de abajo como un ejemplo
. Necesitas escribir el python como:
@app.post("/merchant/change/password") async def receive_keywords( confirmPassword: str = Query(None, alias='confirmPassword') merchantId: int = Query(None, alias='merchantId') newPassword: str = Query(None, alias='newPassword') oldPassword: str = Query(None, alias='oldPassword') session: str = Query(None, alias='session') ): return TrueEsta es una respuesta JSON sin datos, pero puede agregar datos que puede cambiar "Pong" para var. (Esto funciona para .post())
@_app.get("/") def read_root(): """Root route""" return {"Ping": "Pong"}otro ejemplo:
response = {"limit": limit, "offset": offset, "data": users}