Python 如何使用FastAPI中POST的查询参数?
我想在FastAPI中编写一个路由来使用POST请求。我有以下URL示例:Python 如何使用FastAPI中POST的查询参数?,python,fastapi,Python,Fastapi,我想在FastAPI中编写一个路由来使用POST请求。我有以下URL示例: https://URL.com/api/FlexfoneCall/outgoing?AccountId=1234&TimeStamp=2021-05-20+08%3a30%3a56&UniqueCallId=SIP%2f%2b4512345678-0000e4a81463430317&EmployeeLocalNumber=200&ANumber=12345678&BNumber=
https://URL.com/api/FlexfoneCall/outgoing?AccountId=1234&TimeStamp=2021-05-20+08%3a30%3a56&UniqueCallId=SIP%2f%2b4512345678-0000e4a81463430317&EmployeeLocalNumber=200&ANumber=12345678&BNumber=87654321&PhoneLocalNumber=123456
然而,我只习惯于按要求消耗身体。如何从上述示例中“获取”路径参数数据
编辑:
我正在尝试编写一个从外部服务接收上述URL的服务。我试着做了以下几点,因为我认为既然这是一个帖子,我的路线应该是这样的:
@app.post('/callout', response_model=CallIn)
async def create_call_out(callout: CallOut, db: Session = Depends(get_db)):
db_write_call_out = write_call_out(db, callout)
return db_write_call_out
使用以下Pydantic模型:
class CallOut(BaseModel):
accountid: str = None
timestamp: str = None
uniquecallid: str = None
employeelocalnumber: str = None
anumber: str = None
bnumber: str = None
phonelocalnumber: str = None
class Config:
orm_mode = True
和积垢功能:
def write_call_out(db: Session, callout: CallOut):
db_write_call_out = DBCallOut(**callout.dict())
db.add(db_write_call_out)
db.commit()
db.refresh(db_write_call_out)
return db_write_call_out
用于将查询参数写入SQL DB的SQLAlchemy ORM模型:
class DBCallOut(Base):
__tablename__ = "call_out"
accountid = Column('AccountId', String(250))
uniquecallid = Column('UniqueCallId', String(250))
employeelocalnumber = Column('EmployeeLocalNumber', String(250))
anumber = Column('ANumber', String(250))
timestamp = Column('TimeStamp', String(250))
phonelocalnumber = Column('PhoneLocalNumber', String(250))
bnumber = Column('BNumber', String(250))
ID = Column(Integer, primary_key=True, index=True, autoincrement=True)
但我一直收到422的错误
编辑2:
最终将我的路线改为以下路线:
@app.get('/call')
async def outgoing(AccountId: str,
TimeStamp: str,
UniqueCallId: str,
EmployeeLocalNumber: str,
ANumber: str,
BNumber: str,
PhoneLocalNumber: str, db: Session = Depends(get_db)):
callout = {"AccountId": AccountId,
"TimeStamp": TimeStamp,
"UniqueCallId": UniqueCallId,
"EmployeeLocalNumber": EmployeeLocalNumber,
"ANumber": ANumber,
"BNumber": BNumber,
"PhoneLocalNumber": PhoneLocalNumber}
db_write_call_out = write_call_out(db, callout)
return db_write_call_out
这是可行的,但有点笨重。我不确定您是否要使用路径参数(url路径的一部分,如
google.co/youtube/videos/1
),或者是否要使用查询参数(以路径url命名的变量,如google.co?video=1
)但无论哪种方式,您都只需将路径参数声明为方法装饰的参数(@app(params)
),对于查询参数,您可以在方法参数(def get_video(params)
)中声明它们。
因此,对于给定的链接,如果要获取查询参数,请执行以下操作:
@app.post("outgoing/")
async def do_something(
AccountId: int,
TimeStamp: str,
UniqueCallId: str,
EmployeeLocalNumber: str,
ANumber: int,
BNumber: int,
PhoneLocalNumber: int
):
# do some stuff
save_to_db(owner=AccountId,time=TimeStamp,contact=PhoneLocalNumber)
要获取路径变量(按照我上面给出的示例),可以执行以下操作:
@app.post("video/{video_id}")
async def do_something():
# do something
save_to_db(video_id)
无论您选择实现哪一个,都将从客户端发送的请求url中获取参数值(按路径参数路径中的位置,或按查询参数中的相同名称),并将其放入您声明的变量名中。然后像示例所示那样正常使用它们
文档对新手非常友好,因此查询参数请参考,路径参数请参考
作为旁注,对于更多Python代码,我建议您使用snake case来命名变量?不确定是什么?你试过什么?文档中的代码非常容易共享处理
/api/FlexfoneCall/outgoing
的实际代码。我还没有写任何东西,因为我对需要使用的路由类型感到困惑,以及为什么示例直接在URL中发送参数。刚刚更新了问题。对于带有video\u id
的示例,您错过了方法参数,这与query param相同,请参见您请求的body看起来像@Artem吗?您的POST请求中似乎缺少变量或拼写错误。如果accountid是DB键,我建议您将其作为super类Callout(BaseModel)
中的可选变量,然后在Callout post(Callout)
中继承它,其中剩余的强制变量sit@azro为了避免混淆,我故意把它们漏掉了。我举了一个仅使用路径参数的示例,这样可以清楚地区分,并且不融合使BaseModel中的所有变量都是可选的。还是拿着422。