fastapi post

背景

最近有个小项目,到第三方下单。第三方下单会有验签,正常下单,下单异常,异常重试等逻辑的验证。服务端根据第三方的返回来做不同的处理,但正常情况下,第三方总是返回成功的,这时我们则无法验证其他逻辑,因此需要本地mock来验证这部分逻辑,这里选用fastapi,几行代码就可以搞定

fastapi post

在之前的文章简单介绍过fastapi,接下来我们来看看怎么构造post请求

参考文档

示例

# Request body + path + query parameters
# mock_server.py
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

app = FastAPI()

@app.post("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
    print(item, type(item))
    print(item.dict(), type(item.dict()))
    print(item.price, item.tax)
    item_dict = item.dict()
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})

    if q:
        item_dict.update({"q": q})
    return {"item_id": item_id, **item_dict}
  • 启动服务 uvicorn mock_server:app --reload
  • 针对背景中提到的问题,我们完全可以通过返回不同的json数据,来模拟第三方服务的响应即可,如返回json数据如下来模拟下单失败的场景(具体情况根据第三方服务的api文档即可):
result = {
    "code": 4011,
    "message": "订单不存在",
    "result": "",
    "sign": "06f351b34d9b02bc13bc62e66bdab2c8"
}

注:让开发人员修改第三方调用地址到你本地如地址为192.168.113.6:8080/items,启动服务:
方式1:命令行方式需要使用uvicorn mock_server:app --host 0.0.0.0 --port 8080 --reload
方式2:

if __name__ == '__main__':
      import uvicorn
      uvicorn.run("mock_server:app", host="0.0.0.0", port=8080, reload=True, debug=True)