بررسی عمیق درخواست و پاسخ
هر سرور HTTP یک چرخه مشخص را دنبال میکند. یک اتصال را میپذیرد، یک درخواست را تجزیه (parse) میکند، یک مسیر (route) را مطابقت میدهد و یک پاسخ را ارسال میکند.
Hyperlane این فرآیند را آسان میکند. شما میتوانید این چرخه را با استفاده از فراخوانی مستقیم متدها یا attribute macroهای ساده مدیریت کنید.
نحوه مدیریت چرخه حیات درخواست توسط Hyperlane:
- سرور یک اتصال TCP را میپذیرد.
- جریان (stream) را به یک شیء Request تجزیه میکند.
- میانافزار (middleware) درخواست، دادهها را پردازش میکند.
- سرور درخواست را با یک مسیر مطابقت میدهد.
- هندلر مسیر (route handler) اجرا میشود.
- میانافزار پاسخ اجرا میشود.
- پاسخ به کلاینت بازگردانده میشود.
دسترسی به دادههای درخواست:
شما میتوانید از شیء Context برای استخراج دادهها از یک درخواست استفاده کنید.
• get_method() برای متد HTTP.
• get_path() برای مسیر URL.
• get_headers() برای تمام هدرها.
• get_body_json() برای تجزیه بدنه JSON.
• try_get_query() برای یافتن پارامترهای خاص.
Hyperlane همچنین از attribute macroها برای خودکارسازی استخراج دادهها استفاده میکند. به جای نوشتن کد دستی، میتوانید از تگهایی مانند موارد زیر استفاده کنید:
- #[request_body_json] برای تجزیه فوری JSON.
- #[request_query] برای دریافت پارامترهای URL.
- #[request_header] برای استخراج هدرهای خاص.
مدیریت مسیر و فیلتر کردن:
شما میتوانید مسیرهای پویا را با استفاده از نحو (syntax) {param} تعریف کنید. برای مثال: "/test/{text}".
Hyperlane همچنین به شما اجازه میدهد درخواستها را در سطح مسیر فیلتر کنید. شما میتوانید:
- میزبانهای (hosts) خاص را با #[host] مطابقت دهید.
- رفررهای (referers) خاص را با #[reject_referer] رد کنید.
- منطق سفارشی را با #[filter] اعمال کنید.
مدیریت پاسخها و کوکیها: شما پاسخ را از طریق شیء Context کنترل میکنید. میتوانید کد وضعیت (status codes)، هدرها و بدنه را به صورت دستی تنظیم کنید. برای سادهسازی این کار، از response macroها استفاده کنید:
- #[response_status_code(200)]
- #[response_body("Hello World")]
برای مدیریت نشست (session)، از CookieBuilder استفاده کنید. این ابزار به شما اجازه میدهد تاریخ انقضا، دامنهها و پرچمهای امنیتی مانند HttpOnly یا Secure را با سینتکس تمیز تنظیم کنید.
زمانی که پاسخ شما آماده شد، آن را از طریق جریان (stream) با استفاده از متدهایی مانند build() و try_send() ارسال میکنید.
Hyperlane دو راه برای کار کردن به شما میدهد. زمانی که به کنترل صریح نیاز دارید، از فراخوانی متدها استفاده کنید. زمانی که کد تمیز و سریع میخواهید، از attribute macroها استفاده کنید.
Project Code: https://github.com/hyperlane-dev/hyperlane
Source: https://dev.to/tengxgfyrz67s/request-and-response-deep-dive-1j1b