کتابخانه‌ی استاندارد · شبکه

اعتبارسنجی net/http/validate

بررسی ورودی فرم‌ها و پاسخ خطای ۴۰۰.

واردسازی شبکه.اچ تی تی پی.اعتبارسنجی

پنج بررسی کوچک برای ورودی‌ای که به گرداننده‌ی اچ تی تی پی می‌رسد: الزامی، طول، ایمیل است، تطابق دارد و ادعا. چهار تای اول یک رشته می‌گیرند و درست یا نادرست برمی‌گردانند، پس فقط به گرداننده محدود نیستند. ادعا تنها تابعی است که پاسخ می‌دهد: اگر شرطش نادرست باشد ۴۰۰ با پیام جیسون می‌فرستد. برای کار با الگو فراتر از تطابق دارد، مثل یافتن یا جایگزینی، مستقیم از عبارت باقاعده استفاده کنید؛ بدنه‌ی جیسون را با جیسون رمزگشایی کنید و سپس فیلدها را بسنجید.

این بررسی‌ها در واقع چه می‌سنجند:

  • الزامی فقط رشته‌ی خالی را رد می‌کند. مقداری که فقط فاصله است می‌گذرد؛ اول آن را با رشته.پیرایش پیرایش کنید.
  • ایمیل است فقط دنبال یک @ و یک نقطه در هر جای متن می‌گردد، پس @. هم می‌گذرد. فقط اشتباه تایپی را می‌گیرد.
  • تطابق دارد جستجو می‌کند و کل مقدار را نمی‌سنجد: الگو را با ^ و $ مهار کنید. الگویی که کامپایل نشود برای هر مقداری نادرست برمی‌گرداند و شبیه ورودی بد به نظر می‌رسد، پس الگوهایتان را بیازمایید.
  • ادعا گرداننده را متوقف نمی‌کند و پیام را بدون گریزاندن درون جیسون می‌گذارد. پس از ادعای ناموفق برگردید و ورودی کاربر را در پیامش نگذارید.

قاعده‌های رایج

هر تابع به یک پرسش درباره‌ی یک رشته پاسخ می‌دهد. تطابق دارد یک عبارت باقاعده می‌گیرد؛ آن را با ^ و $ مهار کنید، وگرنه هر متنی را که فقط جایی از آن با الگو جور باشد می‌پذیرد. طول نویسه‌ها را می‌شمارد نه بایت‌ها را؛ پس نام فارسی چهار حرفی طولش ۴ است، هرچند هشت بایت جا می‌گیرد.

net-http-validate-rules.salam
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی رشته

تابع بررسی(برچسب: رشته، پذیرفته: منطقی):
    سرچاپ برچسب + ": " + (پذیرفته ? "پذیرفته" : "رد شد")
پایان

تابع ریشه:
    بررسی("نام خالی"، اعتبارسنجی.الزامی(""))
    بررسی("نامی از فاصله"، اعتبارسنجی.الزامی("   "))
    بررسی("فاصله‌ها پس از پیرایش"، اعتبارسنجی.الزامی(رشته.پیرایش("   ")))
    بررسی("نام کاربری ali_75"، اعتبارسنجی.تطابق دارد("ali_75"، "^[a-z][a-z0-9_]{2,15}$"))
    بررسی("نام کاربری 7up"، اعتبارسنجی.تطابق دارد("7up"، "^[a-z][a-z0-9_]{2,15}$"))
    بررسی("کد پستی 1234567890"، اعتبارسنجی.تطابق دارد("1234567890"، "^[0-9]{10}$"))
    بررسی("رنگ #1e90ff"، اعتبارسنجی.تطابق دارد("#1e90ff"، "^#[0-9a-fA-F]{6}$"))
    بررسی("گذرواژه‌ی ۶ نویسه‌ای"، اعتبارسنجی.طول("abc123"، ۸، ۶۴))
    بررسی("نام چهار حرفی مریم"، اعتبارسنجی.طول("مریم"، ۲، ۴))
    سرچاپ "بایت‌های نام:"، "مریم".طول()
    بررسی("ایمیل [email protected]"، اعتبارسنجی.ایمیل است("[email protected]"))
    بررسی("ایمیل @."، اعتبارسنجی.ایمیل است("@."))
پایان
خروجینام خالی: رد شد نامی از فاصله: پذیرفته فاصله‌ها پس از پیرایش: رد شد نام کاربری ali_75: پذیرفته نام کاربری 7up: رد شد کد پستی 1234567890: پذیرفته رنگ #1e90ff: پذیرفته گذرواژه‌ی ۶ نویسه‌ای: رد شد نام چهار حرفی مریم: پذیرفته بایت‌های نام: 8 ایمیل [email protected]: پذیرفته ایمیل @.: پذیرفته

دو نتیجه ارزش نگاه دوباره دارند. الزامی فقط بررسی می‌کند که متن خالی نباشد، پس مقداری که فقط فاصله است می‌گذرد؛ اول آن را با رشته.پیرایش پیرایش کنید. ایمیل است فقط دنبال @ و یک نقطه می‌گردد، پس اشتباه تایپی را می‌گیرد نه نشانی ساختگی را. تنها دلیل واقعی درست بودن یک نشانی، ایمیل تایید است.

همه‌ی مشکل‌ها را یک‌جا گزارش کنید

فرمی که چند فیلد دارد باید همه‌ی اشتباه‌ها را در یک پاسخ بگوید، نه هر بار یکی. همه‌ی بررسی‌ها را انجام دهید، پیام‌ها را جمع کنید و با هم با وضعیت ۴۲۲ بفرستید. ساختن جیسون با جیسون.رشته جیسون و جیسون.آرایه پیام‌ها را درست گریز می‌دهد.

net-http-validate-signup.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون
واردسازی رشته

تابع ثبت نام(ز: صحیح۶۴):
    نام := رشته.پیرایش(اچ تی تی پی.فرم(ز، "name"))
    ایمیل := رشته.پیرایش(اچ تی تی پی.فرم(ز، "email"))
    گذرواژه := اچ تی تی پی.فرم(ز، "password")
    ناپایا خطاها := وکتور {} برگردان وکتور<رشته>
    اگر وارونه اعتبارسنجی.الزامی(نام): خطاها.بیفزا(جیسون.رشته جیسون("نام لازم است")) پایان
    اگر وارونه اعتبارسنجی.ایمیل است(ایمیل): خطاها.بیفزا(جیسون.رشته جیسون("ایمیل درست نیست")) پایان
    اگر وارونه اعتبارسنجی.طول(گذرواژه، ۸، ۶۴): خطاها.بیفزا(جیسون.رشته جیسون("گذرواژه باید ۸ تا ۶۴ نویسه باشد")) پایان
    اگر خطاها.طول() > ۰:
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۲۲)
        اچ تی تی پی.جیسون(ز، "{" + جیسون.عضو خام("errors"، جیسون.آرایه(خطاها)) + "}")
        برگشت
    پایان
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
    اچ تی تی پی.جیسون(ز، "{" + جیسون.عضو("welcome"، نام) + "}")
پایان

تابع بفرست(فرم: رشته):
    ناپایا سر := اچ تی تی پی.سرصفحه جدید()
    سر.درج("Content-Type"، "application/x-www-form-urlencoded")
    پ := اچ تی تی پی.ارسال با("http://127.0.0.1:19788/signup"، فرم، سر)
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.ارسال(م، "/signup"، ثبت نام)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۸)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    بفرست("name=+&email=ali&password=123")
    بفرست("name=Ali&email=ali%40example.com&password=123")
    بفرست("name=Ali&email=ali%40example.com&password=long+enough")
پایان
خروجی422 {"errors": ["نام لازم است", "ایمیل درست نیست", "گذرواژه باید ۸ تا ۶۴ نویسه باشد"]} 422 {"errors": ["گذرواژه باید ۸ تا ۶۴ نویسه باشد"]} 201 {"welcome": "Ali"}

توقف در نخستین مشکل با ادعا

برای یک API ساده، ادعا کوتاه‌تر است: اگر شرط نادرست باشد با ۴۰۰ و {"error": پیام} پاسخ می‌دهد. گرداننده را متوقف نمی‌کند، پس نتیجه را در یک متغیر نگه دارید و اگر نادرست بود برگردید. وگرنه کد بعدی اجرا می‌شود و پاسخش جای خطا را می‌گیرد.

net-http-validate-assert.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب

تابع انتقال(ز: صحیح۶۴):
    مبلغ := اچ تی تی پی.پرسمان(ز، "amount")
    حساب := اچ تی تی پی.پرسمان(ز، "to")
    مبلغ معتبر := اعتبارسنجی.تطابق دارد(مبلغ، "^[1-9][0-9]{0,6}$")
    اعتبارسنجی.ادعا(ز، مبلغ معتبر، "مبلغ باید عددی صحیح از 1 تا 9999999 باشد")
    اگر وارونه مبلغ معتبر: برگشت پایان
    حساب معتبر := اعتبارسنجی.تطابق دارد(حساب، "^IR[0-9]{24}$")
    اعتبارسنجی.ادعا(ز، حساب معتبر، "مقصد باید شبا باشد: IR و پس از آن 24 رقم")
    اگر وارونه حساب معتبر: برگشت پایان
    اچ تی تی پی.جیسون(ز، `{"sent":` + مبلغ + `,"to":"` + حساب + `"}`)
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/transfer"، انتقال)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۹)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19789/transfer"
    هر پرسش در ["?amount=0&to=IR1"، "?amount=500&to=IR1"، "?amount=500&to=IR123456789012345678901234"]:
        پ := اچ تی تی پی.دریافت(پایه + پرسش)
        سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)
    پایان
پایان
خروجی400 {"error":"مبلغ باید عددی صحیح از 1 تا 9999999 باشد"} 400 {"error":"مقصد باید شبا باشد: IR و پس از آن 24 رقم"} 200 {"sent":500,"to":"IR123456789012345678901234"}

ادعا پیام را همان‌طور که هست در جیسون می‌گذارد، پس آن را بدون نقل‌قول دوتایی و بک‌اسلش بنویسید. برای پیامی که ورودی کاربر را در خود دارد، پاسخ را مثل بخش قبل با جیسون.عضو بسازید.

کدام تابع برای کدام کار

کارتابع
فیلد باید پر شودالزامی پس از رشته.پیرایش
کمینه و بیشینه‌ی شمار نویسه‌هاطول
چیزی شبیه نشانی ایمیلایمیل است
شکل ثابت: رقم، کد، شماره‌ی تلفنتطابق دارد با الگوی مهارشده
پاسخ ۴۰۰ وقتی بررسی شکست می‌خوردادعا، سپس برگشت

تابع‌ها

الزامی Required

تابع الزامی(value: رشته): منطقی
اگر مقدار رشته‌ی خالی نباشد درست برمی‌گرداند؛ فاصله هم مقدار حساب می‌شود.
net-http-validate-Check.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب

تابع نام‌نویسی(ز: صحیح۶۴):
    ایمیل := اچ تی تی پی.فرم(ز، "email")
    اعتبارسنجی.ادعا(ز، اعتبارسنجی.ایمیل است(ایمیل)، "invalid email")
    اگر اعتبارسنجی.ایمیل است(ایمیل):
        اچ تی تی پی.متن(ز، "خوش آمدید")
    پایان
پایان

تابع ریشه:
    سرچاپ اعتبارسنجی.الزامی("")، اعتبارسنجی.الزامی("  ")، اعتبارسنجی.الزامی("علی")
    سرچاپ اعتبارسنجی.طول("سلام"، ۲، ۵)، اعتبارسنجی.طول("سلام دنیا"، ۲، ۵)
    سرچاپ اعتبارسنجی.ایمیل است("[email protected]")، اعتبارسنجی.ایمیل است("ali@")
    سرچاپ اعتبارسنجی.تطابق دارد("09121234567"، "^09[0-9]{9}$")، اعتبارسنجی.تطابق دارد("12345"، "^09[0-9]{9}$")
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.ارسال(م، "/signup"، نام‌نویسی)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۵)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    ناپایا سر := اچ تی تی پی.سرصفحه جدید()
    سر.درج("Content-Type"، "application/x-www-form-urlencoded")
    بد := اچ تی تی پی.ارسال با("http://127.0.0.1:19605/signup"، "email=x"، سر)
    سرچاپ اچ تی تی پی.وضعیت(بد)، اچ تی تی پی.بدنه(بد)
    خوب := اچ تی تی پی.ارسال با("http://127.0.0.1:19605/signup"، "email=a%40b.ir"، سر)
    سرچاپ اچ تی تی پی.وضعیت(خوب)، اچ تی تی پی.بدنه(خوب)
پایان
خروجیfalse true true true false true false true false 400 {"error":"invalid email"} 200 خوش آمدید

طول Length

تابع طول(value: رشته، min_len: صحیح، max_len: صحیح): منطقی
اگر تعداد نویسه‌ها (نه بایت‌ها) میان کمینه و بیشینه، با خود آن دو، باشد درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-http-validate-Check.salam

ایمیل است IsEmail

تابع ایمیل است(value: رشته): منطقی
بررسی خیلی ساده‌ی ایمیل: متن باید در هر جایی @ و نقطه داشته باشد. برای اطمینان، ایمیل تأیید بفرستید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-http-validate-Check.salam

تطابق دارد Matches

تابع تطابق دارد(value: رشته، pattern: رشته): منطقی
اگر عبارت باقاعده جایی از مقدار را بپوشاند درست برمی‌گرداند؛ برای سنجیدن کل مقدار آن را با ^ و $ مهار کنید. اگر الگو کامپایل نشود نادرست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-http-validate-Check.salam

ادعا Assert

تابع ادعا(ctx: صحیح۶۴، ok: منطقی، message: رشته)
اگر شرط نادرست باشد، وضعیت ۴۰۰ و بدنه‌ی {"error":"پیام"} را با پیام گریزانده‌نشده می‌گذارد. گرداننده را متوقف نمی‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-http-validate-Check.salam