tgoop.com/Code_Crafters/853
Last Update:
Content Negotiation
تصور کنید که ما یک سایت بینالمللی داریم که روزانه هزاران درخواست توسط افراد از سرتاسر جهان دریافت میکند. همهمان میدانیم که برای چنین سایت بزرگی نمیتوانیم صرفا محتوا را به زبان انگلیسی به اشتراک بگذاریم بلکه باید از یک مکانیزم استفاده کنیم تا هر کاربر به زبان کشور خودش محتوا را دریافت کند.
به این موضوع Content Negotiation میگوییم.
در این پیام به نحوه تصمیمگیری برای انتخاب یک زبان میپردازیم.
به طور کلی ما دو روش برای انتخاب زبان داریم:
- Client-driven negotiation
- Server-driven negotiation
اکنون به Client-driven negotiation میپردازیم.
در این مکانیزم هنکامی که کاربر به سایت codecrafters.ir درخواست میزنند, سرور کد کرفرترز برای کلاینت لیستی از زبانها را ارسال میکند. اکنون مرورگر میتواند تصمیم بگیرد که کدام یک از url ها را باز کرده و به کاربر نشان دهد.
همانطور که متوجه شدید, این روش اصلا مناسب نیست! چرا که باید ۲ برابر ریکوئست ارسال شود و این موضوع latency را به شدت افزایش میدهد. پس بهتر است به فکر یک روش دیگری باشیم تا دیگر کلاینت اینهمه درگیر انتخاب زبان نباشد.
برای حل این موضوع Server-side negotiation بوجود آمد.
وبسرور به ۲ روش تصمیم میگیرد که کدام یک از زبانها را انتخاب کند.
۱- استفاده از header هایی مانند Accept-language و Accept-charset.
۲- استفاده از User-agent کاربر.
شاید این سوال برایتان پیش بیاید که چرا مورد دوم را بررسی میکنیم.
در جواب این سوال باید بدانیم که گاهی تنها زبان مهم نیست بلکه مهم این است که اطلاعات درست به کاربر نمایش داده شود. تصور کنید که یک وبسایت در صفحاتش از جاوااسکریپت استفاده میکند و مرورگر قدیمی ما از جاوا اسکریپت پشتیبانی نمیکنید.
پس سرور باید محتوای درستی که از JS استفاده نمیکند را با زبان درست برای کاربر ارسال کنید.
گاهی Http اجازه میدهد که کاربران یک لیست از انتظارات خود ارسال کنند.
تصور کنید ما میخواهیم به سایت codecrafters.ir درخواست بزنیم اما نمیدانیم که آیا زبان المانی پشتیبانی میشود یا خیر.
پس ما در هدر Accept-language مقدار زیر را ارسال میکنیم:
Accept-language: en;q=0.5, fr;q=0.0., du;1.0.
هنگامی که سرور این پیام را دریافت میکند, اینگونه برداشت میکند که محتوا باید المانی باشد, اگر چنین چیزی موجود نبود, انگلیسی نیز میپذیرد. اما باید توجه داشته باشد که هیچگاه محتوای فرانسوی ارسال نکند.
گاهی نیز این تصمیمات را بر عهده proxy میسپاریم.
این proxy server است که تصمیم میگیرد به کدام resource درخواست بزند و اطلاعات لازم را به کاربر ارسال کند.
#http_guideline
@code_crafters
BY CodeCrafters
Share with your friend now:
tgoop.com/Code_Crafters/853