FastAPI中List作为查询参数的问题及代码拆分改造求助
FastAPI接口参数及请求格式修复方案
问题背景
需要将本地调用NeoController.create_nodes的代码拆分为FastAPI接口,当前API参数定义错误导致断言失败,同时请求URL格式不符合复杂数据传递要求。
1. 修复API接口参数定义
核心问题
原代码使用Query接收List[Node]是错误的:Query仅适用于URL查询参数(简单类型如字符串、数字),复杂对象需通过请求体传递。此外,Node类需支持JSON序列化,才能被FastAPI解析。
修复步骤
步骤1:让Node类支持序列化
修改ontologies.neo中的Node类,继承Pydantic的BaseModel(需先安装依赖:pip install pydantic):
from pydantic import BaseModel from typing import List class Node(BaseModel): # 字段需和原Node类的初始化参数一一对应 path: str name: str attribute: List[str] # 若原Node是ORM类(如SQLAlchemy模型),添加配置兼容 class Config: orm_mode = True
步骤2:修改FastAPI接口
将参数改为请求体接收,无需Query装饰器:
from ontologies.neo import Node from fastapi import FastAPI from typing import List from fastapi.responses import JSONResponse app = FastAPI(title="Neo4jAPI") @app.post("/create/") def create_nodes(instance: List[Node]): NeoController.create_nodes(instance) # 将Node实例转为字典后返回JSON响应 return JSONResponse(content=[node.dict() for node in instance])
2. 修复请求URL及格式
核心问题
原请求通过URL参数传递instance是错误的:URL参数无法承载复杂对象,需将数据放在请求体中,以JSON格式发送。
修复后的请求代码
import requests from ontologies.neo import Node from typing import List db_instance = "Instance:Edge:Datastore:AbstractDatastore:Docker:MongoDB" ds_instance = "Instance:Edge:DataSource:Camera:IDS" instance = [ Node(path=db_instance, name="MongoDB", attribute=['']), Node(path=ds_instance, name="IDS", attribute=['']) ] # 通过json参数传递序列化后的字典列表,requests自动设置Content-Type为application/json response = requests.post( url="http://127.0.0.1:8080/create/", json=[node.dict() for node in instance] ) # 查看响应状态和结果 print(response.status_code) print(response.json())
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

