Python 如何使用FastAPI中POST的查询参数?

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=

我想在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=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。