Dalam FastAPI, anda boleh mencipta titik akhir yang boleh menerima sama ada borang atau badan JSON menggunakan kaedah yang berbeza. Berikut ialah beberapa pilihan:
Pilihan ini melibatkan mencipta fungsi kebergantungan yang menyemak nilai pengepala permintaan Jenis Kandungan dan menghuraikan kandungan menggunakan kaedah Starlette . Jika mana-mana parameter mempunyai nilai yang dihantar kepada mereka, ini bermakna permintaan itu sama ada application/x-www-form-urlencoded atau multipart/form-data. Jika tidak, ia berkemungkinan permintaan JSON.
<code class="python">from fastapi import FastAPI, Depends, Request from starlette.datastructures import FormData app = FastAPI() async def get_body(request: Request): content_type = request.headers.get('Content-Type') if content_type is None: raise HTTPException(status_code=400, detail='No Content-Type provided!') elif content_type == 'application/json': return await request.json() elif (content_type == 'application/x-www-form-urlencoded' or content_type.startswith('multipart/form-data')): try: return await request.form() except Exception: raise HTTPException(status_code=400, detail='Invalid Form data') else: raise HTTPException(status_code=400, detail='Content-Type not supported!') @app.post('/') def main(body = Depends(get_body)): if isinstance(body, dict): # if JSON data received return body elif isinstance(body, FormData): # if Form/File data received msg = body.get('msg') items = body.getlist('items') return msg</code>
Anda juga boleh menggunakan middleware untuk menyemak permintaan masuk dan mengubah hala ke sama ada /submitJSON atau / submitForm endpoint, bergantung pada Content-Type permintaan.
<code class="python">from fastapi import FastAPI, UploadFile, File, Form from typing import Optional, List app = FastAPI() @app.post('/') async def submit(items: Optional[List[str]] = Form(None), files: Optional[List[UploadFile]] = File(None)): # if File(s) and/or form-data were received if items or files: filenames = None if files: filenames = [f.filename for f in files] return {'File(s)/form-data': {'items': items, 'filenames': filenames}} else: # check if JSON data were received data = await request.json() return {'JSON': data}</code>
Anda boleh menguji pilihan di atas menggunakan pustaka permintaan Python:
<code class="python">from fastapi import FastAPI, Request from fastapi.responses import JSONResponse app = FastAPI() @app.middleware("http") async def some_middleware(request: Request, call_next): if request.url.path == '/': content_type = request.headers.get('Content-Type') if content_type is None: return JSONResponse( content={'detail': 'No Content-Type provided!'}, status_code=400) elif content_type == 'application/json': request.scope['path'] = '/submitJSON' elif (content_type == 'application/x-www-form-urlencoded' or content_type.startswith('multipart/form-data')): request.scope['path'] = '/submitForm' else: return JSONResponse( content={'detail': 'Content-Type not supported!'}, status_code=400) return await call_next(request) @app.post('/') def main(): return @app.post('/submitJSON') def submit_json(item: Item): return item @app.post('/submitForm') def submit_form(msg: str = Form(...), items: List[str] = Form(...), files: Optional[List[UploadFile]] = File(None)): return msg</code>
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Kedua-dua Borang dan Data JSON dalam Titik Akhir FastAPI Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!