FastAPI自定义接口参数

fastapi接口定义:

  1. 首先需要定义一个参数类Item,其只有一些基本属性,代表接口所需要的各个参数,继承Basemodel是为了更方便的处理参数,如将参数转化成字典或json类型;如果参数较少,可以不用特地封装一个类,可以参考test_next_api接口,Optional[]的作用是为可选参数限定类型,Query()的作用可以自行了解,参考连接如下:
    Query: FastAPI入门篇一Query参数与字符串验证
  2. 启动fastapi服务:uvicorn模块是一个基于asyncio开发的一个轻量高效的web服务器框架,使用起来比较方便
import uvicorn
import json
from fastapi import FastAPI
app = FastAPI()
# ----------------fastapi接口定义----------------
class Item(BaseModel):  # 定义一个参数类
    name: str
    age: int
    message: dict

@app.post("/testapi")
def send_message(info: Item):
    result = {
            "code": "",
            "message": "",
            "error": None,
            "data": ""
        }
    try:
        print(f'收到参数:{info}')
        print(info.name)
        print(info.age)
        cases = info.message
        case1 = cases['case1']
        print(case1['round'])
        result["code"] = "0000"
        result["message"] = "成功接收参数"
        result["data"] = info
    except Exception as e:
        result["code"] = "0001"
        result["message"] = "未接收到参数"
        result["error"] = f'{e}'
    # indent表示缩进为4,ensure_ascii=False防止中文乱码
    return json.dumps(result, indent=4, ensure_ascii=False)  

@app.get("/test_bext_api")
def next_api(pc_status: bool = Query(...),
             pc_ip: Optional[str] = None):
    print(pc_status)
    print(pc_ip)
    return 'ok'

if __name__ == "__main__":
    uvicorn.run(app, host='127.0.0.1', port=8000)  # 启动服务

访问服务器接口

  1. 请求参数较少时,可以直接将参数放在url中
  2. 请求参数较多时,根据我们自定义的参数类来定义参数类型,以json格式发送
import requests
import json
import socket

# ----------------访问接口----------------
if __name__ == "__main__":
    #test_next_api接口
    pc_ip = socket.gethostbyname(socket.gethostname())  # 获取PC自身ip的方法
    get_url = f'http://127.0.0.1:8000/test_next_api'
    get_resp = requests.get(f'{url}?pc_status=1&pc_ip={pc_ip}').content
    print(get_resp)

    # testapi接口
    p = {'name': 'aaa', 
             'age': 3, 
             'message': {
                 'case1': {
                     'round': 500, 
                     'delay_time': 60
                 }, 
                 'case2': {
                     'round': 400, 
                     'delay_time': 90
                 }
             }
        }

    url = f"http://127.0.0.1:8000/testapi"
    param = json.dumps(p)
    headers = {'content-type': 'application/json'}
    resp = requests.post(url, data=param, headers=headers).json
    print(json.loads(resp))  # 返回的结果也是json类型