اعتبارسنجی net/http/validate
بررسی ورودی فرمها و پاسخ خطای ۴۰۰.
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
پنج بررسی کوچک برای ورودیای که به گردانندهی اچ تی تی پی میرسد: الزامی، طول، ایمیل است، تطابق دارد و ادعا. چهار تای اول یک رشته میگیرند و درست یا نادرست برمیگردانند، پس فقط به گرداننده محدود نیستند. ادعا تنها تابعی است که پاسخ میدهد: اگر شرطش نادرست باشد ۴۰۰ با پیام جیسون میفرستد. برای کار با الگو فراتر از تطابق دارد، مثل یافتن یا جایگزینی، مستقیم از عبارت باقاعده استفاده کنید؛ بدنهی جیسون را با جیسون رمزگشایی کنید و سپس فیلدها را بسنجید.
این بررسیها در واقع چه میسنجند:
الزامیفقط رشتهی خالی را رد میکند. مقداری که فقط فاصله است میگذرد؛ اول آن را بارشته.پیرایشپیرایش کنید.ایمیل استفقط دنبال یک@و یک نقطه در هر جای متن میگردد، پس@.هم میگذرد. فقط اشتباه تایپی را میگیرد.تطابق داردجستجو میکند و کل مقدار را نمیسنجد: الگو را با^و$مهار کنید. الگویی که کامپایل نشود برای هر مقداری نادرست برمیگرداند و شبیه ورودی بد به نظر میرسد، پس الگوهایتان را بیازمایید.ادعاگرداننده را متوقف نمیکند و پیام را بدون گریزاندن درون جیسون میگذارد. پس ازادعای ناموفق برگردید و ورودی کاربر را در پیامش نگذارید.
قاعدههای رایج
هر تابع به یک پرسش دربارهی یک رشته پاسخ میدهد. تطابق دارد یک عبارت باقاعده میگیرد؛ آن را با ^ و $ مهار کنید، وگرنه هر متنی را که فقط جایی از آن با الگو جور باشد میپذیرد. طول نویسهها را میشمارد نه بایتها را؛ پس نام فارسی چهار حرفی طولش ۴ است، هرچند هشت بایت جا میگیرد.
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی رشته
تابع بررسی(برچسب: رشته، پذیرفته: منطقی):
سرچاپ برچسب + ": " + (پذیرفته ? "پذیرفته" : "رد شد")
پایان
تابع ریشه:
بررسی("نام خالی"، اعتبارسنجی.الزامی(""))
بررسی("نامی از فاصله"، اعتبارسنجی.الزامی(" "))
بررسی("فاصلهها پس از پیرایش"، اعتبارسنجی.الزامی(رشته.پیرایش(" ")))
بررسی("نام کاربری 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]"))
بررسی("ایمیل @."، اعتبارسنجی.ایمیل است("@."))
پایاندو نتیجه ارزش نگاه دوباره دارند. الزامی فقط بررسی میکند که متن خالی نباشد، پس مقداری که فقط فاصله است میگذرد؛ اول آن را با رشته.پیرایش پیرایش کنید. ایمیل است فقط دنبال @ و یک نقطه میگردد، پس اشتباه تایپی را میگیرد نه نشانی ساختگی را. تنها دلیل واقعی درست بودن یک نشانی، ایمیل تایید است.
همهی مشکلها را یکجا گزارش کنید
فرمی که چند فیلد دارد باید همهی اشتباهها را در یک پاسخ بگوید، نه هر بار یکی. همهی بررسیها را انجام دهید، پیامها را جمع کنید و با هم با وضعیت ۴۲۲ بفرستید. ساختن جیسون با جیسون.رشته جیسون و جیسون.آرایه پیامها را درست گریز میدهد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون
واردسازی رشته
تابع ثبت نام(ز: صحیح۶۴):
نام := رشته.پیرایش(اچ تی تی پی.فرم(ز، "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")
پایانتوقف در نخستین مشکل با ادعا
برای یک API ساده، ادعا کوتاهتر است: اگر شرط نادرست باشد با ۴۰۰ و {"error": پیام} پاسخ میدهد. گرداننده را متوقف نمیکند، پس نتیجه را در یک متغیر نگه دارید و اگر نادرست بود برگردید. وگرنه کد بعدی اجرا میشود و پاسخش جای خطا را میگیرد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب
تابع انتقال(ز: صحیح۶۴):
مبلغ := اچ تی تی پی.پرسمان(ز، "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"]:
پ := اچ تی تی پی.دریافت(پایه + پرسش)
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)
پایان
پایانادعا پیام را همانطور که هست در جیسون میگذارد، پس آن را بدون نقلقول دوتایی و بکاسلش بنویسید. برای پیامی که ورودی کاربر را در خود دارد، پاسخ را مثل بخش قبل با جیسون.عضو بسازید.
کدام تابع برای کدام کار
| کار | تابع |
|---|---|
| فیلد باید پر شود | الزامی پس از رشته.پیرایش |
| کمینه و بیشینهی شمار نویسهها | طول |
| چیزی شبیه نشانی ایمیل | ایمیل است |
| شکل ثابت: رقم، کد، شمارهی تلفن | تطابق دارد با الگوی مهارشده |
| پاسخ ۴۰۰ وقتی بررسی شکست میخورد | ادعا، سپس برگشت |
تابعها
الزامی Required
تابع الزامی(value: رشته): منطقیواردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.اعتبارسنجی
واردسازی شبکه.مسیریاب
تابع نامنویسی(ز: صحیح۶۴):
ایمیل := اچ تی تی پی.فرم(ز، "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"، سر)
سرچاپ اچ تی تی پی.وضعیت(خوب)، اچ تی تی پی.بدنه(خوب)
پایانطول 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