یادداشت فنی پروژه

وبی

درخواست HTTP، پاسخ و کش؛ در یک رابط زنجیره‌ای

وبی (Webi) کتابخانهٔ جاوای علیرضا اشرفی برای درخواست‌های HTTP در اندروید است؛ پروژه‌ای از سال ۱۳۹۶ / ۲۰۱۷ با تنظیمات درخواست، دریافت رویدادها و ذخیرهٔ پاسخ در حافظه یا روی دستگاه.

گره‌های شبکه و قطعه‌های داده در یک مسیر حلقوی؛ تصویر مفهومی کتابخانهٔ وبی
تصویر مفهومی
نقش من
توسعهٔ کتابخانهٔ جاوا و انتشار کد
سال پروژه
حوزه
کتابخانهٔ اندروید

مسئله و محدودهٔ پروژه

یک درخواست شبکه فقط یک نشانی نیست: پارامترها، هدرها، روش HTTP، زمان انتظار و نحوهٔ تحویل پاسخ هم بخشی از آن هستند. وبی این تنظیمات را در یک رابط قابل استفادهٔ مجدد برای اندروید جمع می‌کند.

این کتابخانه را در سال ۲۰۱۷ ساختم و کد آن را در گیت‌هاب منتشر کردم. ساختار عمومی پروژه شامل یک ماژول library و یک برنامهٔ نمونه است؛ بنابراین می‌توان هم پیاده‌سازی کتابخانه و هم نمونهٔ استفاده از آن را بررسی کرد.

ساختن درخواست با یک زنجیرهٔ خوانا

در کلاس Webi، متد with زمینهٔ اندروید را دریافت می‌کند، from نشانی را مشخص می‌کند و connect اجرای درخواست را آغاز می‌کند. متدهای تنظیمات، همان شیء Webi را برمی‌گردانند تا مراحل کنار هم خوانده شوند.

تنظیم روش درخواست، افزودن پارامتر و هدر، timeout و تعداد تلاش مجدد از همین رابط در دسترس است. این جداسازی باعث می‌شود کد محل استفاده بیشتر دربارهٔ درخواست حرف بزند و جزئیات اجرای شبکه در کلاس WebService باقی بماند.

Webi.with(context)
    .from("https://example.com/data")
    .setRamCache(true)
    .setReadTimeOut(10000)
    .connect();
نمونهٔ شکل رابط تاریخی کتابخانه؛ نشانی نمونه است.

سه محل برای نگه‌داری پاسخ

رابط کتابخانه سه گزینهٔ setRamCache، setXmlCache و setSqlCache دارد. اولی برای حافظهٔ برنامه است؛ دو گزینهٔ دیگر به ذخیره‌سازی SharedPreferences و SQLite مربوط‌اند. برای روش‌های XML و SQL می‌توان کلید دلخواه نیز تعیین کرد.

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

پاسخ همراه با منشأ آن

رویداد onResponse علاوه بر متن پاسخ، مقدار where را تحویل می‌دهد. مستندات این مقدار را برای تشخیص پاسخ شبکه از پاسخ RAM، XML یا SQL معرفی می‌کنند. این اطلاعات هنگام نمایش داده و بررسی رفتار کش مفید است.

کلاس WebiEvents با Handler و mainLooper، callbackها را به رشتهٔ اصلی اندروید منتقل می‌کند. رابط‌هایی برای پاسخ JSON، خطا، timeout و تلاش مجدد نیز در کد وجود دارند؛ هرکدام یک بخش از چرخهٔ درخواست را برای برنامهٔ میزبان قابل مشاهده می‌کنند.

جایگاه امروز این کد

این صفحه شرح یک پروژهٔ تاریخی و ساختار کد منتشرشدهٔ آن است. نمونه‌ها و وابستگی‌های مخزن به دورهٔ توسعهٔ پروژه تعلق دارند. برای استفاده در یک برنامهٔ امروزی باید سازگاری اندروید، وابستگی‌ها، رفتار شبکه و شیوهٔ نگه‌داری داده جداگانه بررسی شوند.

کد و منابع پروژه

علیرضا اشرفی

دربارهٔ نویسنده

علیرضا اشرفی؛ برنامه‌نویس، مدیر سیستم و دانشجوی دکترای نرم‌افزار در دانشگاه آزاد اسلامی، با ریشه‌هایی در ارومیه و آذربایجان ایران.

آشنایی بیشتر ↗