در سالهای اخیر، توسعه اپلیکیشن بسیار پیچیده شده است. روزهایی که صرفا برخی از دادهها را از پایگاه داده بیرون میکشیدند و متنی را با یک فرم مشخص در یک صفحه نمایش میدادند گذشته است. امروز، ما از توسعهدهندگان اپلیکیشن میخواهیم که رابطهای کاربری غنی و پیچیدهای بسازند و تجربیات وب بهیادماندنی را از منابع مختلف ایجاد کنند. متاسفانه با افزایش پیچیدگی، استایلهای سنتی API مانند REST دیگر چندان کارآمد نیستند. در این شرایط است که باید از گراف کیوال کمک بگیریم. اما GraphQL چیست و چطور در توسعه اپلیکیشنهای مورد نیازمان در عصر حاضر کمک میکند؟ گراف کیوال رویکردی مدرن برای ارتباط کلاینت و سرور است که با هدف بهبود روشی که توسعهدهندگان اپلیکیشنهای تحتوب را میسازند ارائه شده است.
در این مطلب، توضیح میدهیم که GraphQL چیست و از کجا آمده است. در ادامه به نحوه کار GraphQL اشاره میکنیم و میبینیم که تفاوت آن نسبت به رویکردهای سنتی برای ساخت و نگهداری API چیست و چه مزایایی را بهدنبال دارد.
GraphQL چیست؟
GraphQL هم نوعی API (یا زبان کوئری) و یک موتور رانتایم برای پاسخ دادن به کوئریهای دریافتی است. گراف کیوال یک API کارآمد و ایدهآل را برای اپلیکیشنهای موبایل و پیادهسازی اسکیماها پیچیده ارائه میدهد که در آن فقط زیرمجموعههای داده خاصی مورد نیاز است.
با GraphQL، توسعهدهندگان میتوانند دادههایی را که نیاز به Fetch شدن از یک API دارند مشخص کنند. همچنین امکان Fetch کردن براساس تقاضا (بهجای Fetch کردن همه دادهها بهصورت یکباره)، اعمال تغییرات فوری و ادغام منابع دادههای شخص ثالث در یک برنامه فراهم میکند.
برنامهها میتوانند با استفاده از کوئریهای گراف کیوال، سرویسهای گراف کیوال را فراخوانی کنند. این کوئریها دقیقا همان عناصر دادهای را که مشتری درخواست میکند برمیگرداند. این شیوه باعث صرفهجویی در تعداد فراخوانیهای API، پهنای باند شبکه و پسپردازش میشود. برای APIهای دادهمحور و APIهایی که درست در لبه دستگاههای مصرفکننده مانند تلفنهای همراه و تبلتها قرار دارند، این یک راهحل فوقالعاده کارآمد است.
تاریخچه GraphQL
گراف کیوال در سال 2012 توسط شرکت Meta درحالیکه مشغول ساخت اپلیکیشن موبایل فیسبوک بود ایجاد شد. گراف کیوال با هدف رفع برخی از کاستیهای REST طراحی و در سال 2015 منبع باز شد.
میزان پذیرش GraphQL امروزه همچنان در حال افزایش است. این یک انتخاب محکم برای سازمانهایی است که میخواهند دادههای پراکنده خود را بهراحتی از طریق API در دسترس قرار دهند. جای تعجبی نیست که نامهای بزرگی مانند نتفلیکس، شاپیفای، پیپال، گیتهاب و فیسبوک از گراف کیوال استفاده میکنند.
آیا GraphQL جایگزین REST میشود؟
از آنجایی که REST رایجترین روش برای دسترسی به API است، نمیتوان آن را با گراف کیوال جایگزین کرد. علت این است که REST یک فریمورک معماری برای ساخت API است، درحالیکه گراف کیوال هم بهعنوان موتور رانتایم و هم بهعنوان زبان کوئری عمل میکند.
اساسا، درخواستهای HTTP برای تعامل با APIهای REST استفاده میشوند، درحالیکه کلاینتها برای مصرف سرویسهای API ارائهشده توسط موتور رانتایم سمت سرور در گراف کیوال از URLها استفاده میکنند.
هنگام اجرای یک کوئری، API گراف کیوال بهطور همزمان از چندین منبع داده استفاده میکند که از جمله REST APIها، پایگاههای داده و میکروسرویسها را شامل میشود. سرور با پنهان کردن مبداهای متفاوت اطلاعات درخواستی، دادهها را از طریق یک API ارائه میکند. یک تفاوت کلیدی که با زبانهای کوئری معمولی وجود دارد این است که GraphQL در هر فراخوانی اجازه دسترسی به اطلاعات را در چندین بخش میسر میکند.
کاربردهای GraphQL
حالا که تا حدودی با ماهیت گراف کیوال آشنا شدیم اجازه دهید ببینیم کاربردهای GraphQL چیست و چطور به ما کمک میکند.
برنامههای موبایل و تحت وب
گراف کیوال کارایی و قدرت را برای برنامههای موبایل و تحت وب به ارمغان میآورد. بههرحال، شرکت متا با استفاده از همین API توانسته است اپلیکیشن فیسبوک را بسازد. GraphQL با ارائه یک اندپوینت (Endpoint) برای جستوجوی دادهها بدون نیاز به ارائه درخواستهای متعدد به سرور، زمان بارگذاری را کاهش و تجربه کاربری را بهبود میدهد. اگر قرار است یک اپلیکیشن تحت وب را بر روی سرور مجازی خود میزبانی کنید، این موضوع اهمیت زیادی دارد.
داشبوردهای بلادرنگ و تجمیع دادهها
آیا تمایل دارید همزمان با تغییر دادهها، بر روی آنها نظارت داشته باشید؟ استفاده از GraphQL برای ایجاد برنامههای داشبورد بلادرنگ و پویا میتواند راهحلی برای همگام شدن با مجموعههای دادهای که در دائما در حال تکامل هستند در نظر گرفته شود.
تجمیع و نسخهسازی API
گراف کیوال را میتوان برای ترکیب چندین API در یک اندپوینت گراف کیوال استفاده کرد. این امر ردیابی نسخههای مختلف APIها را آسانتر و راهی برای نسخهسازی (Versioning) دادهها فراهم میکند.
کش دادهها
برای کش کردن دادهها در سمت کلاینت با هدف تسریع زمان بارگذاری میتوان از GraphQL استفاده کرد.
نحوه کار GraphQL
گراف کیوال برای رفع دو نیاز طراحی شده است:
- دادههای بازگرداندهشده توسط یک منبع باید دقیقا با آنچه مشتری به دنبال آن است مطابقت داشته باشد.
- اینکه طراحی یک API یا منبع داده نباید نحوه مصرف دادهها را به مشتری دیکته کند.
برای برآورده کردن این الزامات، سرویس GraphQL یک اسکیما را تعریف میکند.
اسکیماها، فیلدها، انواع و حلکنندهها
اسکیما گراف کیوال دادههایی را که کلاینتها میتوانند از API گراف کیوال درخواست کنند توصیف میکند. این دادهها شامل تمام مواردی را که کلاینت ممکن است بخواهد کوئری به او بازگرداند شامل میشود. در حالت ایدهآل، این اسکیما در قالب یک «زبان تعریف اسکیما» یا SDL نمایش داده میشود تا خوانایی بیشتری داشته باشد.
اسکیما شامل انواع شیء است که تعیین میکند کوئریها امکان دسترسی به چه نوع اشیا و فیلدهای درون آن اشیا را داشته باشند. بهعنوان مثال، قطعه کد زیر اسکیمای یک کوئری GraphQL را نشان میدهد.
`type query { teacher students { name } } }`
همانطور که میبینید اسکیما دارای دو فیلد teacher و students است.
اگر برنامهای بخواهد از طریق یک API سنتی REST به نام دانشآموزان و معلمان آنها دسترسی پیدا کند، یک کوئری در برابر API URL اجرا میکند و API ممکن است نام معلم، تعداد دانشآموزان در کلاس، موضوع کلاس، نام دانشآموزان و سن دانشآموزان را برگرداند.
بهعبارت دیگر، کلاینت با اطلاعات بیشتری از آنچه واقعا نیاز دارد مواجه میشود. درحالیکه اگر این اسکیما در سرویس گراف کیوال تعریف شده باشد و برنامه کوئری را اجرا کند، برنامه فقط آنچه را که میخواست (نام دانشآموزان و معلمشان) دریافت میکند. خروجی ممکن است چیزی شبیه به این باشد:
`{ "data": { "teacher”: "Joe Bloggs", "students": [ { "name": "Jane Doe" }, { "name": "Joe Smith" }, … ] } }`
هر فیلد درون نوع شیء، یک نوع خاص خودش را خواهد داشت. نوع یک فیلد میتواند نوع شیء دیگر یا یک نوع اسکالر مانند Int، Boolean، ID، String یا Float باشد. بهعنوان مثال، اسکیما برای شیء کلاس را میتوان بهصورت زیر تعریف کرد:
`type class { teacher: String student: [StudentName] } type StudentName{ name: String }`
سپس هر فیلد در اسکیما به یک حلکننده پیوست میشود. حلکننده تابعی است که دادههای آن فیلد را برای کوئریهای گراف کیوال Fetch میکند. موتور کوئری گراف کیوال برای تایید کوئری، هر کوئری را در طول رانتایم با اسکیما مقایسه میکند. اگر کوئری معتبر باشد، موتور کوئری حلکننده هر فیلد را اجرا میکند تا دادههای آن فیلد را Fetch کند.
عملیات GraphQL
از آنجایی که ما در مورد خواندن دادههای مربوط به کوئریهای گراف کیوال صحبت میکنیم، شاید این تصور ایجاد شود که این تنها نوع عملیات مجاز است.
کوئری GraphQL
کوئریهای گراف کیوال شبیه به روش GET REST API است. همانطور که توضیح دادیم، این عملیاتی است که به دادهها دسترسی دارد.
جهش GraphQL
جهش درخواستی برای افزودن یا تغییر داده است. این عملیات شبیه به روشهای PUT، POST PATCH یا DELETE REST API انجام میشود.
اشتراکهای GraphQL
اشتراکهای گراف کیوال مکانیزمی قدرتمند برای دریافت بلادرنگ دادهها از سرورها حتی بدون درخواست آن بهحساب میآید. با استفاده از این ابزار، مشتریان میتوانند اعلانهایی را در مورد تغییرات یا حذف موارد در پایگاه داده دریافت کنند و در نهایت، جریانی از بهروزرسانیها را در مورد وضعیت کوئریهای مرتبط خود دریافت کنند.
روش کار بهاینصورت است که به کلاینت مشترک اجازه میدهد رویدادهایی را که به آنها علاقه دارد انتخاب و مشخص کند که هربار با وقوع آن رویداد، دادهها چگونه باید ارسال شود. برخلاف کوئریهای گراف کیوال یا درخواستهای جهش که به اتصالات کوتاهمدت HTTP با سرورها متکی هستند، اشتراک کلاینتها را ملزم میکند تا کانالهای ارتباطی دوجهته طولانیمدت را از طریق WebSocket ایجاد کنند.
هنگامی که این اتصال راهاندازی شد، کلاینتها میتوانند کوئریهای اشتراک خود را به سرورهایی که از آن استفاده میکنند ارسال کنند.
مقایسه GraphQL و REST
APIهای REST (مخفف Representational State Transfer) بهطور گسترده مورد استفاده قرار میگیرند، اما این به معنی ایدهآل بودن آنها برای هر موقعیتی نیست. گراف کیوال یک گزینه جایگزین با قابلیتهای سفارشیسازی بیشتر را ارائه میدهد. همچنین، در موارد استفاده مناسب، گراف کیوال میتواند یک انتخاب کارآمدتر باشد.
REST به هماهنگی بین صاحبان سرویسها و کلاینتها با یک API سفارشی برای هر صفحه نیاز دارد. اما با گراف کیوال، توسعهدهندگان اپلیکیشن دادههای موردنیاز خود را اعلام میکنند و توسعهدهندگان سرویس جزئیات مربوط به دادههایی که میتوانند به اشتراک بگذارند را فراهم میکنند. در نهایت این دو با هم تطبیق داده میشود.
بااینحال، اگر دلیل قانعکنندهای برای استفاده از GraphQL یا gRPC ندارید، REST میتواند یک گزینه مطمئن باشد.
در ادامه اشاره میکنیم که تفاوتهای سطح بالا بین REST و GraphQL چیست تا بیشتر با این دو API آشنا شوید.
GraphQL REST امکان انعطافپذیری کوئری بسیار بیشتری را نسبت به REST فراهم میکند.
Fetch کردن داده با REST میتواند به چندین سفر بین سرور و کلاینت نیاز داشته باشد، درحالیکه گراف کیوال در یک سفر انجام میشود. این امر باعث میشود تا گراف کیوال بهطور بالقوه برای اپلیکیشنهای موبایل یا در موارد استفادهای که پهنای باند یک نگرانی مهم است، گزینهای مناسبتر باشد.
REST پشتیبانی بسیار خوبی را برای کش کردن ارائه میدهد، درحالیکه گراف کیوال این کار را انجام نمیدهد. البته کتابخانههای شخص ثالث GraphQL میتوانند در این مورد مفید باشند.
یادگیری گراف کیوال در مقایسه با REST بسیار زمانبر است و ممکن است تیمها برای افزایش عملکرد به آموزشهای بیشتر نیاز داشته باشند. درحالیکه REST برای کسانی که با HTTP و معماری کلاینت-سرور سروکار دارند بهراحتی قابل درک است.
گراف کیوال از طریق اسکیما مستندسازی میشود، درحالیکه این مورد در REST اتفاق نمیافتد.
استفاده از گراف کیوال به تلاش بیشتری در بخش بکاند نیاز دارد، اما میتواند استفاده از APIها را آسانتر کند. REST از آپلود فایل پشتیبانی میکند، درحالیکه گراف کیواین از این قابلیت بهره نمیبرد.
مزایای GraphQL
مزایای گسترده گراف کیوال شامل افزایش انعطافپذیری، ثبات و امنیت و کاهش پهنای باند و پیچیدگی است. در این بخش به برخی از موارد کاربرد ایدهآل و مزایای GraphQL اشاره میکنیم.
بدون Over-Fetching یا Under-Fetching
مزیت اصلی گراف کیوال توانایی آن در ارائه همان دادههایی است که درخواست شده است و در مقایسه با کوئریهای REST، امکان Over-Fetching (واکشی بیشتر از حد) کمتری را فراهم میکند. هنگام استفاده از REST و ارسال کوئری در یک اندپوینت واحد، ممکن است اطلاعات اضافی فراوانی وجود داشته باشد، درحالیکه با گراف کیوال دریافت دادههای خاص آسانتر است. علاوهبراین، اگر دادههای لازم از یک منبع در دسترس نباشد، REST به چندین فراخوانی API نیاز دارد که به Under-Fetching (واکشی کمتر از حد) در هر مکان منجر میشود.
اما با مشخص کردن یک اسکیما، GraphQL با ارائه یک نقشه راه دقیق با امکان ارسال کوئری و بازگشت عناصر داده چالشهای بالا را حل میکند.
زیرساخت شبکه کوچکتر
دریافت مجموعهای خاص از دادهها در هر تلاش، تضمین میکند که کوئریهای گراف کیوال با بارهای کارهای بهمراتب کمتری از موارد دریافتشده با Over-Fetching سروکار خواهد داشت.
همچنین، از آنجایی که کوئریهای گراف کیوال نیازی به ارسال درخواستهای متعدد به منابع مختلف ندارند، ترافیک شبکه کمتری در جریان است. این امر برای اپلیکیشنهای توزیعشده که از طریق شبکههایی با موقعیت جغرافیایی متفاوت به یکدیگر دسترسی دارند مفید است.
پروتکلهای HTTP/HTTPS
کوئریهای GraphQL میتوانند برای دسترسی به APIها از پروتکلهای HTTP/HTTPS استفاده کنند. این یعنی شما مجبور نیستید هنگام طراحی اپلیکیشنهای خود به روشهای ارتباطی جدید توجه کنید.
APIهای در حال تکامل
APIهای گراف کیوال امکان افزایش تدریجی اسکیما را بدون ایجاد اختلال در کوئریها فراهم میکنند. درست مانند APIهای REST، میتوانید یک API گراف کیوال را نسخه کنید. بااینحال، برخلاف APIهای REST، با APIهای گراف کیوال میتوانید اسکیمای خود را بهطور مداوم ارتقا دهید. از آنجایی که فقط عناصر داده درخواستی برای هر کوئری برمیگردد، افزودن فیلدها و اشیاء جدید، باعث از بین رفتن درخواستهای فعلی کلاینت نمیشود. برای ترکیب فیلدها و اشیاء جدید، میتوانید کوئریهای جدیدی اضافه کنید.
اسکیما با تایپ قوی
اسکیماهای گراف کیوال و انواع شیء آنها بهصورت سلسلهمراتبی و اعلامی تعریف میشوند. این امر به توسعهدهندگان کمک میکند تا رابطه بین عناصر داده (مانند گراف) را درک و ساختار کوئری را بهدقت تنظیم کنند.
همچنین اسکیماها و اشیا در گراف کیوال تایپ قوی (Strong Type) محسوب میشوند. موتور رانتایم گراف کیوال تضمین میکند که کوئریها از نظر نحوی دقیق هستند و تایپ آنها با فیلدها و انواع شیء اسکیمای درخواستی مطابقت دارد.
در صورت عدم تطابق، سرویس پیغام خطا برمیگرداند. داشتن اسکیماهای تایپ قوی که بهخوبی تعریف شدهاند به این معنی است که رفتارهای کوئری قابل پیشبینیتر هستند و خطاها بهراحتی تشخیص داده میشود.
مجموعهای غنی از ابزار
گراف کیوال از یک اکوسیستم پویا شامل ابزارهای توسعه و تست برخوردار است. برخی از این ابزارها منبع باز هستند که توسعه آنها را بسیار آسانتر میکند. ابزارهای محبوب گراف کیوال شامل Apollo، Graphback، GraphiQL، GraphQL Playground و GraphQL Explorer است.
ویژگیهای GraphQL
حالا که تاحدودی متوجه شدیم مزایای GraphQL چیست میتوانیم به ویژگیهای مهمی که توسط این API ارائهشده بپردازیم.
کارایی
از واکشی بیش از حد جلوگیری میکند؛ در رویکردهای سنتی مانند REST شما معمولا در نهایت Over-Fetching را تجربه میکند و دادههای بیشتری را نسبت به آنچه واقعا نیاز دارید درخواست میکنید. با گراف کیوال میتوانید دقیقا آنچه را که نیاز دارید بخواهید. مزیت این رویکرد کاهش پهنای باند است که ممکن است بهویژه در دستگاههای موبایل یا کممصرف مهم باشد.
از Under-Fetching (چند رفت و برگشت) جلوگیری میکند؛ مشکل دیگری که در Fetch کردن رویکرد REST وجود دارد این است که در یک رفت و برگشت تمام دادههای موردنیازتان را دریافت نمیکنید. فرض کنید که لیست دوستان خود را در یک اپلیکیشن شبکه اجتماعی Fetch کنید و برای دریافت عکس پروفایل هر کدام از آنها به کوئریهای جداگانه نیاز داشته باشید. گراف کیوال به شما کمک میکند این چالش را بهراحتی حل کنید.
تجربه توسعهدهنده
سلسلهمراتبی و اعلامی؛ دادههای GraphQL ذاتا گرافیکی و اعلامی هستند. این باعث میشود که کوئریهای شما راحتتر قابل درک و کار کردن با دادههای شما هم آسانتر باشد. با Nest کردن، میتوانیم دادههای مرتبط را درخواست کنیم، کوئریها را منسجم نگه داریم و حداقل زمان را صرف ترکیب چندین پاسخ به یکدیگر کنیم. درحالیکه گاهی اوقات در رویکرد REST باید زمان قابل توجهی را به این کار اختصاص بدهیم.
تایپ قوی (API پایدار)؛ گراف کیوال تایپ قوی است. این یعنی با یک API پایدارتر با اشکالات کمتر در توسعه سروکار داریم که امکان ابزارسازی هوشمندتر را ارائه میدهد.
نسخهسازی GraphQL؛ گراف کیوال از مفهوم یک گراف منفرد و بهطور تدریجی توسعهیافته حمایت میکند. وقتی فیلدهایی را در گراف موجود خود اضافه یا حذف میکنید و تغییر میدهید، میتوانید نکات (Hint) بیشتری را ارائه دهید. این رویکرد را با رویکردی که در نسخهسازی با REST انجام میشود و کلی است مقایسه کنید.
معماری
کلاینت را از سرور جدا میکند؛ توسعهدهندگان رابط کاربری نیازی ندارند منتظر بمانند تا تیمهای بکاند ابتدا یک API بسازند. یک اسکیمای گراف کیوال بهعنوان قراردادی برای توسعهدهندگان فرانتاند عمل می کند تا کار ساخت را شروع کنند و تیمهای بکاند با خیال راحت سرویسهای زیرساختی را بسازند که نیازهای گراف را برآورده میکند.
تنها منبع حقیقت؛ توسعهدهنگان رابط کاربری برای دسترسی به کل دادههای پشت گراف یک شرکت فقط باید از یک اندپوینت مطلع باشند.
مقیاسپذیری با Federation؛ گراف کیوال با استفاده از رویکردی تحت عنوان Federation بهخوبی در معماری میکروسرویس مورد استفاده قرار میگیرد. Federation این امکان را به تیمهای بکاند میدهد تا گرافهای زیرساختی را حفظ و آنها را در یک گراف واحد برای کل سازمان ادغام کنند.
ویژگی دروننگری یا Introspection؛ این ویژگی کلیدی به شما امکان میدهد از سیستم گراف کیوال بپرسید که از چه نوع کوئریهایی پشتیبانی میکند. دروننگری چارچوبی را برای انواع ابزارهای عالی فراهم میکند. ابزارهایی برای تولید خودکار اسناد API و انواع تایپاسکریپت (TypeScript) برای حلکنندهها و کوئریهای شما وجود دارد.
جامعه
ابزارسازی عالی؛ ما ابزارهایی را برای توسعهدهندگان گراف کیوال میسازیم. از کتابخانههای کلاینت گراف کیوال (مانند کلاینت Apollo) گرفته تا IDEهای گراف کیوال (مانند Apollo Studio) و سرورهای گراف کیوال (مانند Apollo Server)، احتمالا به ابزارسازی مدرن در زبانهای مختلف نیاز پیدا میکنید. همچنین، طیف گستردهای از ابزارهای ساختهشده در جامعه بالغ GraphQL در دسترس شما قرار دارد که میتوانید آنها را امتحان کنید.
پذیرش گسترده؛ گراف کیوال در حال حاضر توسط تعداد زیادی از شرکتهای برجسته از جمله نیویورک تایمز، توییتر، شاپیفای، گلسدور، پیپال، گیتهاب، اکسپدیا و غیره استفاده میشود.
جمعبندی
GraphQL یک زبان کوئری و یک سرور رانتایم است که معمولا از طریق HTTP اجرا میشود. گراف کیوال طراحی شده است تا عملکرد و کارایی بالاتری داشته باشد و تجربه توسعهدهنده بهتری را برای کار با دادهها در معماری کلاینت-سرور ارائه دهد. پذیرش GraphQL از زمانی که برای اولینبار منبع باز شد رشد قابل توجهی داشته است و بهنظر نمیرسد به این زودی کنار گذاشته شود.
سوالات متداول
GraphQL چیست؟
گراف کیوال یک زبان کوئری برای API شما و یک رانتایم سمت سرور برای اجرای کوئریها با استفاده از یک تایپ سیستمی است که برای دادههای خود تعریف میکنید.
آیا GraphQL بهتر از REST است؟
بستگی به مورد استفاده دارد. بااینحال، رایجترین مزیت بیانشده این است که گراف کیوال به کلاینت اجازه میدهد فقط برای دادههایی که نیاز دارد درخواست بدهد و این رویکرد مسائل مربوط به Over-Fetching و Under-Fetching را حل میکند. از آنجایی که کار با گراف کیوال کارایی بیشتری دارد، توسعه با گراف کیوال بسیار سریعتر از REST انجام میشود.
چرا GraphQL از محبوبیت بالایی برخوردار است؟
گراف کیوال معمولا از طریق استقلال تیم و تجمیع نسخهسازی API، تجربه توسعهدهنده بهتری را فراهم میکند. اسکیمای تایپ قوی، Fetch کردن دادههای اعلامی و کد و بار کار قابل پیشبینی از دیگر دلایلی هستند که گراف کیوال را به یک زبان کوئری محبوب تبدیل کرده است.
نوشته GraphQL چیست؟ آیا میتواند جایگزین REST شود؟ اولین بار در مجله آقای وب. پدیدار شد.