FastAPI / دليل حلول تحريري

تحقق 422: العثور على مصدر المدخل أوشكله الخاطئ

شخص طلبا صحيح الصياغة لا يطابق عقد FastAPI دون إضعاف التحقق أوكشف البيانات.

وقت القراءة التقريبي: 2 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يرسل العميل JSON صحيحة ويتلقى 422 قبل المعالج أوخطأ query أو header رغم اسم مماثل بالجسم. وقد يخطئ المصدر والغلاف والنوع والمطلوب والبديل والقيد.

افهم الأسباب المحتملة

  • تشمل الأسباب غلاف نموذج غير متوقع واستعلاما أوترويسة غائبة وخلط null بالغياب والفاصلة بالتكرار والتحويل بالصارم. تضيف التبعيات متطلبات لا يظهرها توقيع المعالج وحده.

قراءة الخطأ الآمن قبل التغيير

سجل الإصدارات والطريقة والمسار والمصدر والموقع والنوع الآمنين لا الجسم والاعتماد والسياق كله. ميز المصادر واتبع التبعية. يرسل المثال غلافا خاطئا ثم الصحيح بتطبيق معزول بلا خادم أوتخزين.

python تشخيص غلاف خاطئ كامل
from fastapi import FastAPI
from fastapi.testclient import TestClient
from pydantic import BaseModel
class Item(BaseModel):
    quantity: int
app = FastAPI()
@app.post("/items")
def create(item: Item): return item.model_dump()
with TestClient(app) as client:
    wrong = client.post("/items", json={"item": {"quantity": 2}})
    print(wrong.status_code, wrong.json()["detail"][0]["loc"])
    print(client.post("/items", json={"quantity": 2}).json())
الناتج المتوقع
422 ['body', 'quantity']
{'quantity': 2}

لا يوفر الغلاف body.quantity ويلائم المسطح العقد.

مقارنة شكل الجسم الفعلي

يتوقع النموذج المفرد حقوله مباشرة ما لم يغير embed العقد، وقد تعدل المعاملات المتعددة الغلاف. قارن OpenAPI وJSON وContent-Type لا اسم متغير Python. وراجع المجهول فقد يرفض الغلاف أويتجاهله ويبقى المطلوب غائبا.

تتبع الترويسات ومدخل التبعية مستقلة

لا يسد حقل JSON ترويسة مطلوبة ولو تشابه الاسم. يثبت المثال غياب المعرف حتى مع نسخة بالجسم. راجع الاسم والبديل والتحويل والموقع بالإصدار. تختلف المفاتيح المكررة ونص الفاصلة إلا بتطبيع معلن.

python تشخيص مصدر ترويسة كامل
from typing import Annotated
from fastapi import FastAPI, Header
from fastapi.testclient import TestClient
app = FastAPI()
@app.post("/check")
def check(value: Annotated[str, Header(alias="X-Lab-ID", min_length=3)]):
    return {"received": value}
with TestClient(app) as client:
    wrong = client.post("/check", json={"X-Lab-ID": "abc"})
    print(wrong.status_code, wrong.json()["detail"][0]["loc"])
    print(client.post("/check", headers={"X-Lab-ID": "abc"}).json())
الناتج المتوقع
422 ['header', 'X-Lab-ID']
{'received': 'abc'}

تفي الترويسة الفعلية بالمصدر فقط، وهي بيانات عامة لا مصادقة.

إصلاح العقد المتفق لا العرض

صحح العميل حسب العقد أوغير التصريح بمراجعة توافق ومخطط وعميل. افحص الصرامة والافتراضي والاختياري والبديل والعلاقة مستقلة. لا تجعل أمن المطلوب اختياريا أوتعِد 200 لإرضاء الواجهة. افصل المجال بعد التحليل.

التحقق من الطلب السالب والموجب معا

احفظ إعادة اصطناعية وافحص المقبول والخطأ الأصلي والغائب والنوع والتركيبات بالحالة والموقع لا كل رسالة متغيرة. امنع الأثر للباطل وأعد الحالات بعد التغيير. لا بيانات أواعتمادات أوشبكة أوقاعدة؛ والنتيجة عقد متوقع لا قبول أوسع بلا مراجعة.

تحقق من نجاح الإصلاح

ينجح المصحح ويبقى الأصلي مرفوضا بتصنيف آمن، ويطابق المخطط والتبعيات العقد. اختبر الغياب والنوع دون القيم ومنع الأثر قبل الرفض.

امنع تكرار المشكلة

  • صرح بالمصدر والنموذج وحدث المخطط والمثال واختبر البديل والغلاف. راجع التحديث كعقد وحافظ على الحجب لا إعادة الطلب الخام.

المراجع الرسمية