انتخاب بهتر بین REST و GraphQL کدام است؟

11 آبان 1398
REST-GraphQL

REST و GraphQL

در عصر جدید و مخصوصا چند سال اخیر استفاده از API ها به شدت توسعه یافته و فراگیر شده است. حتی کوچکترین وب سایت ها نیز ممکن است بر اساس نیاز خود یک سیستم API راه اندازی کرده باشند. بنابراین آشنایی و تجربه ی کار با این API ها از ملزومات برنامه نویسی محسوب می شود.

در سال های اخیر با دو مدل یا استاندارد API مواجه بوده ایم که مشهورترین مدل های پیاده سازی API هستند و تمام عرصه ی اینترنت را در اختیار خودشان دارند:

  • REST API
  • GraphQL API

بحث بین طرفداران REST و GraphQL بالا گرفته است که کدام مورد از آن یکی بهتر است. به همین دلیل من تصمیم گرفته ام که موضوع را در یک مقاله به صورت خلاصه بررسی کنم، خصوصا که تصورات اشتباه زیادی بین برنامه نویسان در این زمینه وجود دارد؛ مثلا بسیاری از برنامه نویسان تصور می کنند GraphQL تنها برای برنامه هایی است که front-end آن ها با react نوشته شده باشد که البته تصور اشتباهی است. بنابراین بدون مقدمه بحث را شروع می کنم.

خلاصه ای از تفاوت های REST و GraphQL

در این مقاله زمانی که از API صحبت می کنیم منظورمان web API است یعنی API که روی یک سرور پیاده سازی شده است و درخواست های HTTP را قبول می کند (چه از طریق مرورگر، چه از طریق برنامه های اندرویدی و...). برای ساختن چنین وب سرویسی معمولا از یکی از دو معماری REST یا GraphQL برای API ها استفاده می شود. انتخاب هر کدام از این روش ها باعث می شود نحوه ی تعامل کاربر (client) با وب سرویس تغییر کند و کاربر باید کدهای خود را به شیوه ی متفاوتی از دیگری بنویسد.

تفاوت در Endpoint ها

در REST چندین endpoint داریم، به زبان ساده تر چندین URL داریم که نسبت به متدهای مختلف HTTP واکنش نشان می دهند (مثلا GET/users یا POST/product و ...). کاربر برای تعامل با این API می تواند از URL های مختلف استفاده کند تا به هدف خود برسد. این در حالی است که GraphQL تنها یک endpoint دارد که همیشه از طریق درخواست POST در دسترس کاربر (client) است و می توانید هر نامی برای آن انتخاب کنید اما به طور معمول به شکل POST/graphql انتخاب می شود.

تفاوت در اطلاعات ارسالی، تکنولوژی های وابسته و state

در هر دو روش، اطلاعات معمولا به صورت JSON منتقل می شوند. البته ممکن است در برخی از موارد در REST داده های باینری ارسال کنیم و یا در GraphQL یک endpoint داشته باشیم که فایل برمی گرداند اما در اکثر مواقع با همان JSON کار می شود بنابراین در این زمینه تفاوتی بین REST و GraphQL وجود ندارد.

در هر دو معماری REST و GraphQL می توانید از هر زبان سمت سروری مثل PHP یا Node.js یا Python و غیره استفاده کنید. همچنین می توانید از هر فریم ورک front-end ای برای پیاده سازی ظاهر سایت خود استفاده کنید. این تصور که GraphQL فقط با React.js کار می کند تصور کاملا اشتباهی است و در این زمینه نیز هیچ تفاوتی بین REST و GraphQL نیست. چنین عقیده ای معمولا از آنجا می آید که GraphQL توسط فیسبوک ارائه شده است (سازندگان React.js) و کاربران به صورت خودکار تصور می کنند که GraphQL مخصوص React است. بگذارید حتی فراتر از این برویم، حتی اگر با زبان swift در حال ساختن نرم افزار های اندرویدی و ios هستید می توانید از هر دو استفاده کنید چه برسد به کتابخانه های front-end مثل react و vue.

همچنین هر دو معماری Stateless هستند، یعنی برایشان مهم نیست که client چه کسی بوده است. به همین دلیل مواردی مثلا session based authentication (احراز هویت بر اساس session ها) را مشاهده نخواهید کرد چرا که stateless بودن به معنی فراموش کار بودن است! یعنی API به طور کامل فراموش می کند که درخواست قبلی را چه کسی برایش فرستاده است چرا که هیچ داده ای در مورد client ذخیره نمی شود بنابراین راهی برای شناخت آن وجود ندارد. البته باید توجه داشت که مواردی مانند شناسه های یکتا یا Token های احراز هویت قابل پیاده سازی هستند که با هر درخواست ارسال می شوند و این شناسه ها برای شناسایی شما سمت سرور ذخیره نخواهند شد.

محوریت URL یا زبان کوئری؟

مرکز اصلی تفاوت ها بین این دو معماری، نحوه ی ارسال درخواست ها به آن ها است. همانطور که گفتم در REST چندین endpoint داریم (چندین URL). به طور مثال شما می توانید یک درخواست POST را به شکل زیر ارسال کنید:

POST/user{name:’Amir’}

این درخواست معمولا به آدرسی شبیه به domain/user ارسال می شود (به جای Domain باید آدرس سایت خود را قرار دهید). در درخواست بالا یک شیء JSON را برای سرور ارسال کرده ایم که حاوی یک نام است. همچنین برای دریافت اطلاعات یک کاربر می توانید یک درخواست GET را به URL متفاوتی ارسال کنید تا داده ها برایتان ارسال شوند. بنابراین در REST، این توسعه دهندگان هستند که تعیین می کنند شما چه داده هایی را به چه شکل (نوع درخواست HTTP) به چه آدرسی (URL) ارسال می کنید. در مثال بالا POST می شود نوع درخواست، user/ می شود مسیر یا URL و شیء JSON که حاوی نام من می باشد نیز همان داده های ارسالی است که ساختار آن توسط توسعه دهندگان مشخص می شود. باید توجه کرد که هر درخواستی ممکن است چند مورد از این موارد را داشته باشد، مثلا ممکن است درخواست های GET هر سه مورد را نداشته باشند. در این مدل اگر از قوانین توسعه دهندگان پیروی نکنید، به جای اطلاعات صحیح یک خطا به شما برگردانده خواهد شد که می گوید از قالب صحیح درخواست پیروی نکرده اید.

در طرف دیگر GraphQL را داریم که فقط یک endpoint دارد و تنها درخواست های POST را قبول می کند. یک درخواست ساده در این مدل به شکل زیر است:

POST/graphql {query: ‘query: …’}

اگر این درخواست را به صورت کامل و باز بنویسیم چنین چیزی را مشاهده می کنیم:

{
     Query {
          User {
               name
               age
          }
     }
}

از آنجا که این مدل درخواست های مختلف را قبول نمی کند و فقط با POST کار می کند چطور می توانیم درخواست خود را ارسال کنیم؟ در این مدل باید در همان داده هایی که ارسال می کنید درخواست خود را هم توضیح بدهید. بنابراین در این مدل درخواست همیشه POST است و graphql نیز مسیر یا URL ثابت همیشگی ما است. این دو مورد تغییر نمی کنند. سپس درون query باید از یک زبان query خاص به نام GraphQL query استفاده کنیم تا درخواست خودمان را بنویسیم.

مزیت ها و معایب دو روش

در نمونه درخواست بالا از GraphQL می فهمیم که query نوع درخواست است (query معادل GET در REST است). User همان endpoint ما می باشد و name و age نیز فیلدهایی هستند که می خواهیم. بنابراین یکی از بزرگترین مزیت های استفاده از GraphQL نسبت به REST این است که در REST معمولا داده های زیادی دریافت می کنیم و نمی توانیم دقیقا مشخص کنیم که چه داده هایی را می خواهیم. مثلا اگر درخواست GET/user را داشته باشیم دیگر در حالت عادی نمی توانیم مشخص کنیم که چه اطلاعاتی از user را می خواهیم و همه ی ستون هایش به ما برگردانده می شود اما در GraphQL مشخص می کنیم که مثلا فقط نام و سن کاربر را می خواهیم.

مزیت REST نسبت به GraphQL نیز این است که پیاده سازی آن بسیار ساده تر است. برخلاف GraphQL شما نیازی به یادگیری یک زبان کوئری جداگانه ندارید و در سمت سرور نیز به راحتی آن را پیاده سازی می کنید اما با GraphQL باید پکیج هایی داشته باشید که کارتان را آسان تر کنند و شما را در مراحل توسعه یاری دهند. همچنین از طرف کلاینت نیز کار آسان تر می شود و کاربر مجبور نیست این کوئری های طولانی تر و پیچیده تر را به صورت دستی بنویسد (نوشتن این کوئری های طولانی برای GraphQL باعث بالا رفتن احتمال خطا نیز می شود). از طرفی REST از نظر محبوبیت جلو تر از GraphQL است و در این زمینه نیز برنده ی مسابقه محسوب می شود.

در آخر می توانم به شما بگویم که اگر برنامه ای دارید که در صفحات آن اطلاعات مختلفی کوئری می شود و همچنین حفظ پهنای باند بسیار مهم است می توانید از GraphQL استفاده کنید چرا که در این نوع معماری می توانید دقیقا مشخص کنید که چه نوع داده ای را می خواهید اما اگر در هر صفحه به اطلاعات زیادی نیاز دارید بهتر است از REST استفاده کنید چرا که برخی اوقات دوست داریم مثلا تمام اطلاعات user در اختیار ما باشد.

امیدوارم درک خوبی نسبت به تفاوت های GraphQL و REST پیدا کرده باشید.

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.