Python开发:接口场景设计
我的开发场景是:前端选中某个文件后,点击提交,后端开始下载并解析文件,生成apks文件。
涉及到两个接口,分别是getS3List和submitS3Path,已经调通了,后端可以成功收到前端的请求并进行下载和解析。
遇到的的问题是:后端解析需要时间,前端在等待过程中提示:请求超时、请求失败,请稍后重试,后端解析需要一分钟左右。
我的解决方案是:后端异步任务 + 轮询进度接口,让前端立即得到“任务已开始”的响应,然后再异步处理解析任务。
(1)后端接口返回任务 ID:
@router.post("/app/aabParse")
async def parse_aab_api(url: str = Form(...)):logger.info(f'[parse_aab_api] url: {url}')task_id = str(uuid.uuid4())task = asyncio.create_task(process_aab_task(task_id, url))async with tasks_lock:tasks[task_id] = {"status": "processing", "result": None, "task": task}return JSONResponse(content={"code": 0,"message": "success","data": {"task_id": task_id,"task_message": "任务已开始,请稍后查询结果"}})
@router.get("/app/aabParse/status/{task_id}")
async def get_task_status(task_id: str):async with tasks_lock:task = tasks.get(task_id)if not task:raise HTTPException(status_code=404, detail="Task not found")status = task["status"]result = task["result"]return JSONResponse(content={"code": 0,"message": "success","data": {"status": status,"result": result}})
(2)前端立即返回成功,然后轮询状态;
优点:
(1)不会超时;
(2)用户体验更好;
(3)可展示“解析中…”动画;