مقدمه ای بر GraphQL

مقدمه ای بر GraphQL

در دنیای اپلیکیشن‌ ها، همیشه نیاز به ارتباط با تعدادی از API های وب وجود داشته است. خواه اپلیکیشن یک وب اپلکیشن، یک اپلیکیشن موبایلی و یا یک اپلیکیشن برای سیستم ‌عامل های دسکتاپ باشد. یکی از راه های پرکاربرد استفاده از اطلاعات وب، استفاده از RESTful API با فرمت‌ های مختلفی مانند JSON یا XML می باشد. در حال حاضر نیز پر استفاده ترین روش کار با API ها، همین ساختار است.

فرض کنید وب اپلیکیشنی داشته و قصد داریم لیست کاربران وبسایت را از API دریافت کنیم. همچنین فرض کنید کاربران دارای لیستی از مطالب بوده و هر مطلب نیز تعدادی کامنت داشته باشد و ما به این اطلاعات نیز احتیاج داریم. اطلاعات دیگری مانند tag‌ های مطالب، لینک ها و ... نیز وجود دارد که همه‌  این اطلاعات در دیتابیس ذخیره شده و از backend دریافت می شود. برای گرفتن اطلاعات مختلف با استفاده از REST API نیاز است تا به چند endpoint مختلف درخواست ارسال شود. این کار باعث ارسال درخواست‌ های زیادی به سرور خواهد شد. اما آیا این امکان وجود دارد تا تنها با استفاده از یک درخواست به این مهم دست پیدا کنیم؟

پاسخ سوال بالا، بله است. به شرطی که با یادگیری مفهوم جدیدی به نام GraphQL (بخوانید گراف کیو ال) علاقه مند باشید. در ادامه این مقاله، GraphQL را بررسی خواهیم کرد.

GraphQL چیست؟

graphQL یک زبان کوئری سمت کلاینت (client side) برای ارتباط با API و یک سرویس سمت سرور برای اجرای این کوئری‌ ها است که برای اولین بار در سال 2012 توسط فیس بوک ابداع شد سپس در سال 2015 به صورت open source در اختیار جامعه‌ی برنامه نویسی قرار گرفت.

این زبان به کلاینت این امکان را  می‌دهد تا دقیقا آنچه را که لازم دارد از سرور دریافت (یا ارسال) کند. به طور مثال برای رفع مشکل یاد شده در ابتدای مقاله، با استفاده از GraphQL، کلاینت این قابلیت را دارد تا تنها داده ‌های مورد نیاز خود را درخواست کند.

GraphQL برای داده های خود بر روی یک پایگاه داده خاص متمرکز نیست و می تواند با هر پایگاه داده ‌ای پیاده سازی شود. این تکنولوژی به عنوان یک سرویس بر روی سرور اجرا می ‌شود و معمولا داده های پایگاه‌ های داده را برای کلاینت ارسال می ‌کند.

سرویس GraphQL با استفاده مفهوم type و field های مربوط به type ها، اطلاعات را در اختیار کلاینت قرار می‌دهد. برای درک بهتر، یک type می ‌تواند به صورت زیر تعریف شود:

type Query {
  me: User
}

type User {
  id: ID
  name: String
}

در قطعه کد بالا که به زبان GraphQL نوشته شده است، یک نوع (type) برای User تعریف شده است. این نوع، دارای دو field با عنوان‌های id و name می باشد. هر field در GraphQL دارای نوع خاصی است که در اینجا field اول دارای نوع ID و فیلد دوم دارای نوع String است (درباره انواع مختلف در مقالات بعد صحبت خواهد شد). برای هر یک از field ها در سرور یک تابع تعریف می‌شود که داده‌ی مورد انتظار آن را ایجاد کند. به طور مثال برای کد بالا می‌ توان از توابع زیر استفاده کرد:

function Query_me(request) {
  return request.auth.user;
}

function User_name(user) {
  return user.getName();
}

بعد از اینکه GraphQL بر روی سرور اجرا شود، برای استفاده از query تعریف شده و دریافت کاربر، کلاینت کافی است با استفاده از یک کوئری، داده‌ی مورد نظر خود را دریافت کند. کوئری دریافت شده باید با type تعریف شده بررسی شود (validation) و در صورت درست بودن type، توابع تعریف شده، داده‌ های مورد انتظار کوئری را ایجاد خواهند کرد. به طور مثال کوئری می‌تواند مانند قطعه کد زیر باشد:

{
  me {
    name
  }
}

که این کوئری نتیجه‌ ای مانند قطعه کد زیر به صورت json دریافت خواهد کرد:

{
  "me": {
    "name": "sokan Academy user"
  }
}

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

همچنین با توجه به مشخص بودن type ها و نتیجه کوئری ها، GraphQL این امکان را دارد تا مستنداتی درباره داده ها و نوع هر داده هایی که به کلاینت ارائه می دهد را در اختیار کلاینت بگذارد.

برخی از ویژگی های GraphQL عبارت‌اند از:

  • ارسال تنها یک درخواست به سرور برای داده های خواسته شده.
  • درخواست داده های مورد نظر توسط کلاینت.
  • وجود مستندات برای داده ها و نوع داده های موجود.
  • عدم ایجاد مشکل در هنگام تغییر نسخه api.
  • پشتیبانی از پروتکل های مختلف (مانند http)
  • وجود کتابخانه های متعدد در زبان‌ های برنامه نویسی مختلف برای پیاده سازی GraphQL

همچنین GraphQL در کنار ویژگی های خوب خود، چالش هایی دارد. برخی از این چالش ها عبارت اند از:

  • مدیریت خطای دشوارتر نسبت به REST (در graphQL  در صورت بروز خطا ، همچنان http status code ارسال شده توسط سرور ، 200 خواهد بود).
  • احراز هویت (Auth) پیچیده نسبت به REST (هرچند روش هایی برای رفع این چالش وجود دارد، اما هنوز به پختگی REST نیست).
  • مدیریت دشوارتر Access Control های کاربران.
  • آپلود فایل.
  • Community نسبتا کوچک (نسبت به REST).

REST یا GraphQL ؟

همانطور که گفته شد GraphQL دارای مزایا و چالش هایی است. از طرفی پاسخ این سوال که "Rest بهتر است یا GrapQL" ، بستگی به نیازمندی شما دارد. اما به طور کلی می توان گفت GraphQL باعث سرعت بیشتر اپلیکیشن شما خواهد شد و در مقابل REST امنیت endpoint ها را تضمین می کند (به دلیل پختگی بیشتر). می توانید بر اساس نیاز، از هر دو تکنولوژی در اپلیکیشن خود استفاده کنید.

امیدوارم از این مقاله استفاده کرده و دیدی کلی نسبت به GraphQL به دست آورده باشید. در مقاله بعد نحوه نوشتن کوئری ها را بررسی خواهیم کرد. 

 

دلشاد و خندان باشید.

نظرات
اگر login نکردی برامون ایمیلت رو بنویس: