GraphQL چیست؟ این سوالی است که در دنیای توسعه نرمافزار و طراحی API ها به طور روزافزون مطرح میشود. در حالی که REST API سالها به عنوان استاندارد غالب شناخته میشد، GraphQL به عنوان یک روش نوین برای مدیریت دادهها معرفی شده است. این زبان کوئری به برنامهنویسان امکان درخواست اطلاعات به صورت دقیق و بهینه را میدهد و از ارسال دادههای اضافی یا ناقص جلوگیری مینماید. در این مقاله، به بررسی ویژگیها و مزایای استفاده از GraphQL پرداخته خواهد شد.
تصویر(1)
GraphQL چیست؟
GraphQL یک زبان کوئری و ویرایش داده متن باز برای API ها است و همچنین محیطی اجرایی جهت انجام کوئریها با دادههای موجود ارائه می کند. فیسبوک GraphQL را در سال ۲۰۱۲ توسعه داد و در سال ۲۰۱۵ به صورت عمومی منتشر کرد.
گراف کیو ال یک توصیف کامل و قابل درک از دادههای موجود در API ارائه میکند و به کلاینت این امکان را میدهد تا دقیقاً آنچه که نیاز دارد و نه بیشتر، درخواست نماید. این زبان، توسعه API ها را در طول زمان آسانتر میکند و ابزارهای قدرتمندی برای توسعهدهندگان فراهم میآورد.
GraphQL از خواندن، نوشتن (Mutation) و اشتراکگذاری تغییرات داده (بروزرسانیهای لحظهای که معمولاً توسط WebHooks پیادهسازی میشود) پشتیبانی میکند. سرورهای GraphQL برای زبانهای مختلفی، از جمله Haskell، JavaScript، Perl، Python، Ruby، Java، C++، C#، Scala، Go، Erlang، PHP و R در دسترس هستند.
محبوبترین زبانهای برنامهنویسی برای کار با GraphQL چیست؟
بر اساس نظرسنجی GraphQL در سال ۲۰۲۴، این زبانهای برنامهنویسی بیشترین محبوبیت را در میان توسعهدهندگان گراف کیو ال دارند:
- TypeScript/JavaScript
- Go
- Java/Kotlin
- C#/.Net
- Rust
آموزش GraphQL: بررسی نحوه عملکرد آن
پس از پاسخگویی به سوال "GraphQL چیست؟"، می بایست نحوه عملکرد آن نیز مورد بررسی قرار گیرد. جذابیت گراف کیو ال عمدتاً بر اساس این مفهوم است که کاربران میتوانند دقیقاً همان دادههای موردنیاز را درخواست کنند و نتیجهای کاملاً قابل پیشبینی دریافت نمایند (نه کمتر و نه بیشتر). هنگام ارسال کوئری به API، GraphQL بدون دریافت دادههای اضافی یا کمتر از حد نیاز، پاسخی بهینه ارائه میدهد که باعث میشود اپلیکیشنهای مبتنی بر GraphQL سریع، پایدار و مقیاسپذیر باشند.
برای مثال، در صورتی که بخواهید از وبسایت example.com تنها عناوین مقالات منتشرشده را درخواست کنید، کوئری مشابه زیر خواهد بود:
{
academyPosts {
title
}
}
از این کد میتوان دریافت که تنها عناوین academyPosts درخواست شده است. بنابراین، پاسخ برگشتی به صورت زیر خواهد بود:
{
"data": {
"academyPosts": [
{
"title": "Headless Mobile Content Management System (Mobile CMS)"
},
{
"title": "What is Content as a Service (Caas)"
},
{
"title": "Headless CMS and SEO Best Practices"
},
{
"title": "What Is A Headless CMS?"
},
{
"title": "Understanding Digital Experience Platforms (DXP) and Headless CMS"
},
{
"title": "Understanding the Content Mesh and how a Headless CMS fits in."
},
{
"title": "The Era of Application Content"
},
{
"title": "Best Practices for Headless Content Modelling"
},
{
"title": "Choosing the best Headless CMS"
},
{
"title": "What is GraphQL?"
},
{
"title": "Choosing a Headless CMS for Content Creators"
},
{
"title": "Selecting a Headless CMS - a Checklist"
},
{
"title": "What is a DXP (Digital Experience Platform)?"
},
{
"title": "What is the JAMStack?"
}
]
}
}
به راحتی میتوان مشاهده نمود که در چنین درخواستی، داده دریافتی کاملاً حداقلی و بهینه خواهد بود اما گراف کیو ال تنها به دسترسی فیلدهای یک منبع محدود نمیشود بلکه امکان دنبالکردن ارتباطات میان دادهها را نیز فراهم میکند. در حالی که REST API ها نیازمند بارگذاری اطلاعات از چندین URL هستند، GraphQL تمامی دادههای مورد نیاز را در یک درخواست واحد دریافت میکند که این ویژگی باعث افزایش سرعت اپلیکیشنها حتی در اتصالات کند شبکه تلفن همراه خواهد شد.
برای درک بهتر، یک درخواست پیچیدهتر بررسی می شود بدین صورت که لیستی از پستهای وبلاگ را مشاهده نمایید اما به جای فقط عنوان پستها، اطلاعات نویسندگان این پستها، اسلاگ هر پست و دستهبندیهای مرتبط با آنها را نیز دریافت کنید. کوئری به شکل زیر خواهد بود:
{
blogPosts{
title
authors {
name
twitterHandle
title
}
slug
categories {
title
}
}
}
پاسخ دریافتی به صورت زیر خواهد بود:
{
"data": {
"blogPosts": [
{
"title": "Delivering a DIY Store powered by a Headless CMS for ECommerce",
"authors": [
{
"name": "Jamie Barton",
"twitterHandle": "notrab",
"title": "Developer Advocate"
},
{
"name": "Jonathan Steele",
"twitterHandle": "ynnoj",
"title": "Developer Advocate"
}
],
"slug": "delivering-a-diy-store-powered-by-a-headless-cms-for-ecommerce",
"categories": [
{
"title": "Content Management"
},
{
"title": "Headless CMS"
},
{
"title": "Projects and Examples"
}
]
}
}
GraphQL به جای استفاده از چندین اندپوینت (Endpoints)، دادهها را بر اساس انواع (Types) و فیلدها (Fields) سازماندهی میکند. این ویژگی باعث میشود که راهاندازی و استفاده از آن بسیار آسان باشد زیرا تمام دادههای موردنیاز از یک اندپوینت واحد قابل دسترسی هستند. همچنین GraphQL با استفاده از سیستم Typing تضمین میکند که درخواستهای ارسالشده فقط شامل دادههای مجاز باشند و در صورت بروز خطا، پیامهای واضح و مفیدی ارائه شوند. Typing توسعهدهندگان را از نوشتن کدهای دستی برای پردازش پاسخها بینیاز میکند.
تصویر(2)
مزایای GraphQL چیست؟ چرا باید از آن استفاده کرد؟
با بررسی عملکرد GraphQL در مثالهای مختلف، کاملاً مشخص میشود که این فناوری سریع، پایدار و مقیاسپذیر است. سه ویژگی کلیدی که GraphQL را به یک سینتکس ایدهآل تبدیل کردهاند عبارتند از:
- کلاینتها میتوانند دقیقاً مشخص کنند که چه دادهای نیاز دارند.
- تجمیع دادهها از چندین منبع مختلف با گراف کیو ال به سادگی انجام میشود.
- به جای اندپوینتها، از یک سیستم Typing برای توصیف دادهها بهره میبرد.
این ویژگیها باعث میشوند که دریافت دادهها در GraphQL بسیار بهینه باشد و مزایایی مانند خوانایی بالا، جلوگیری از دریافت دادههای اضافی یا ناکافی، تایپ قوی و امکان توسعه انعطافپذیر را فراهم کند.
تصویر(3)
تاریخچه گراف کیو ال
GraphQL، مشابه React، در سال ۲۰۱۲ توسط فیسبوک طراحی شد و در سال ۲۰۱۵ به صورت عمومی منتشر شد. با متنباز شدن GraphQL، این پروژه در سال ۲۰۱۸ از فیسبوک به بنیاد GraphQL (میزبانیشده توسط بنیاد لینوکس) منتقل گردید.
ایده اولیه GraphQL زمانی شکل گرفت که فیسبوک تلاش داشت مقیاسپذیری اپلیکیشن موبایل خود را افزایش دهد. اپلیکیشن موبایل فیسبوک نسخهای تطبیق یافته از وبسایت آن با استراتژی استفاده HTML5 برای موبایل بود اما این روش به دلیل مصرف بالای پهنای باند و تجربه کاربری نامناسب، نتیجه مطلوبی نداشت. در نتیجه، تیم توسعه تصمیم گرفت نسخه iOS را از پایه با فناوریهای بومی (Native) بسازد.
مشکل اصلی در پیادهسازی فید خبری (News Feed) موبایل این بود که دادهها به سادگی یک پست و کامنتهای آن نبودند؛ بلکه هر پست مجموعهای تودرتو (Nested) و مرتبط به هم داشت. API های موجود فاقد ساختاری سلسلهمراتبی بودند، امکان انتخاب دادههای موردنیاز را فراهم نمیکردند و قابلیت نمایش لیست پستهای متنوع را نداشتند.
در نهایت، تیم فیسبوک تصمیم گرفت یک API جدید برای News Feed طراحی کند و اینجا بود که GraphQL متولد شد. طی چند ماه، محدوده پوشش API گسترش یافت و نهایتا در سال ۲۰۱۵، مشخصات رسمی گراف کیو ال به همراه یک پیادهسازی مرجع در جاوا اسکریپت منتشر شد.
پذیرش و گسترش گراف کیو ال
با در نظر گرفتن نیاز بالای صنعت به چنین راهکاری، پذیرش گراف کیو ال افزایش یافت. تنها در عرض شش ماه، پیادهسازیهایی از GraphQL در زبانهایی مانند PHP، JavaScript، Python، Scala و Ruby ایجاد شد. آنچه که در ابتدا به عنوان یک مشخصات فنی آزمایشی (Hobbyist Spec) مطرح شده بود، خیلی سریع توجه شرکتهای بزرگ را جلب کرد. امروزه شرکتهایی مانند GitHub، Yelp، Airbnb و بسیاری دیگر از GraphQL استفاده میکنند.
نقشه کلی گراف کیو ال نشان میدهد که این فناوری تاکنون حدود ۲۲۲ هزار ستاره در GitHub، ارزش بازار ۴.۷ تریلیون دلاری و بیش از ۹ میلیارد دلار سرمایهگذاری را به خود اختصاص داده است. GraphQL در حال حاضر به یکی از مهمترین فناوریهای توسعه API تبدیل شده و اکوسیستم گستردهای از سرورها، کلاینتها، دروازهها (Gateways) و اپلیکیشنها را شامل میشود.
تصویر(4)
تفاوت GraphQL و REST چیست؟
حال که به سوال "GraphQL چیست" پاسخ داده شد، می بایست تفاوت GraphQL و REST نیز بررسی شود. REST API یک مفهوم معماری برای نرمافزارهای مبتنی بر شبکه می باشد اما GraphQL زبان کوئری (Query Language) و مجموعهای از ابزارها است که روی یک اندپوینت واحد اجرا میشود.
در سالهای اخیر، از REST جهت طراحی API های جدید استفاده شده است اما گراف کیو ال بیشتر برای بهینهسازی عملکرد و افزایش انعطافپذیری در دریافت دادهها به کار می رود.
زمانی که از REST استفاده میکنید، همیشه مجموعههای کامل داده بازگردانده میشوند. اگر بخواهید اطلاعاتی از X شیء دریافت نمایید، باید X درخواست REST API ارسال کنید. برای مثال، اگر بخواهید اطلاعات محصولی را در یک وبسایت فروشگاهی درخواست نمایید، ممکن است درخواستهای شما به این شکل باشند:
- درخواست productInfo برای دریافت نام محصول، توضیحات و ...
- درخواست pricing جهت دریافت قیمتهای مربوط به محصول
- درخواست images برای دریافت تصاویر محصول از یک مجموعه داده دیگر
- و ...
در نهایت، همه اطلاعات موردنظر شما بازگردانده میشوند اما این کار در قالب چندین درخواست انجام خواهد شد. علاوه بر این، هر مجموعه داده ممکن است مقدار زیادی اطلاعات اضافی که نیازی به آن ندارید، مانند نظرات، تخفیفها و ... را نیز برگرداند که این مسئله وابسته به ساختار محتوا یا داده در هر اندپوینت است.
از طرفی، این روش بسیار ساده است؛ شما یک اندپوینت مشخص دارید که کار مشخصی انجام میدهد، بنابراین درک و مدیریت آن آسان می باشد. به عبارت دیگر، اگر یک اندپوینت X داشته باشید، X نوع داده را دریافت خواهید کرد. اما در مقابل، اگر بخواهید اطلاعاتی را از یک اندپوینت خاص دریافت نمایید، نمیتوانید فیلدهای خروجی را محدود کنید و همیشه مجموعهای کامل از دادهها بازمیگردد که این همان مشکل دریافت بیش از حد دادهها (Over-fetching) است.
GraphQL از زبان کوئری خود برای مشخص کردن دقیق دادههای موردنیاز استفاده میکند که می تواند چندین شیء مختلف یا فیلدهای خاص درون هر موجودیت باشد. در GraphQL، شما یک اندپوینت X دارید که میتواند اطلاعات زیادی ارائه نماید اما باید مشخص کنید چه چیزی نیاز دارید.
با در نظر گرفتن همان مثال، درخواست در گراف کیو ال میتواند شامل موارد زیر باشد:
- productName (نام محصول)
- productDescription (توضیحات محصول)
- productImage (تصویر محصول)
- productPrice (قیمت محصول)
و تمام این اطلاعات از یک اندپوینت و طی درخواستی واحد، بدون هیچ داده اضافی دیگری دریافت میشود. بنابراین، مشکل دریافت بیش از حد دادهها (Over-fetching) دیگر مطرح نخواهد بود.
جمع بندی:
در این مقاله تلاش شد تا به سوال "GraphQL چیست؟" پاسخ داده شود. GraphQL راهکاری مدرن برای مدیریت دادهها در برنامههای تحت وب و موبایل ارائه میدهد. با قابلیت دریافت دقیق دادههای موردنیاز، کاهش تعداد درخواستها و انعطافپذیری بالا، GraphQL نسبت به REST مزایای قابل توجهی دارد. انتخاب بین این دو بستگی به نیاز پروژه دارد اما برای پروژههایی با ساختار داده پیچیده یا نیازمند بهینهسازی عملکرد، گراف کیو ال گزینهای قدرتمند و کارآمد به شمار میآید.