GraphQL مرگ APIهای سنتی!

معماری REST و GraphQL: تفاوت‌ها و مزایا در توسعه API باترفلایلی

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

REST مبتنی بر مدل Client-Server است و از متدهای HTTP مانند GET، POST، PUT و DELETE برای ارتباط گرفتن با سرور استفاده می‌کند. در دنیای معماری REST منابع از طریق URI یا Uniform Resource Identifiers شناخته می‌شوند و از طریق فرمت‌ها و قالب‌هایی نظیر JSON و XML نمایش داده می‌شوند. از این جهت برای ایجاد APIهایی که stateless هستند بسیار کاربردی و ایده‌آل است. از همان ابتدا مدیریت خطا را ایجاد کنید تا اطمینان حاصل کنید که برنامه شما همیشه پاسخ بارگذاری معتبری دارد، حتی در سناریوهای خرابی و با رشد و مقیاس شدن. این می‌تواند به توسعه‌دهندگان و کارکنان عملیاتی که روی سیستم کار می‌کنند اجازه دهد تا اشتباه را مشخص کنند.

GRPC همچنین دارای ویژگی‌های backward compatibility   است که به‌روزرسانی ساختار داده شما را بدون شکستن کد مشتری آسان می‌کند. GraphQL همچنین از آپلود خارج از جعبه فایل پشتیبانی نمی کند و برای پیاده سازی این عملکرد به راه حلی نیاز دارد. پشتیبانی از GraphQL برای چارچوب‌های مختلف وب/برنامه در مقایسه با REST هنوز ضعیف است. اکوسیستم JS بیشترین پشتیبانی را دارد، اما چشم انداز در حال تغییر است و پشتیبانی روز به روز برای سایر زبان ها و چارچوب ها بهبود می یابد. GraphQL به شدت انعطاف پذیر بوده و می‌تواند با منابع داده‌ای و زبان های برنامه نویسی مختلف کار بکند. با در نظر گرفتن موارد گفته شده می‌توان به این نتیجه رسید که GraphQL به نسبت REST از یک مزیت مهم برخوردار است و آن کاهش حجم داده های انتقالی است.

در اینجاست که cache کردن در پیچیده‌ترین حد خود قرار دارد؛ زیرا به cache‌ کردن در سطح فیلد نیز خواهد داشت که به دست آوردن آن در GraphQL کار ساده‌ای نیست؛ زیرا فقط از یک اندپوینت استفاده نمی‌کند. اگر شما نیاز به انعطاف‌پذیری بیشتر در مورد درخواست‌ها و پاسخ‌های API خودتون دارید و نمی‌خواهید over and under fetching داشته باشید. همچنین، اگه به داده‌های مشخص خاصی از چندیدن سورس نیاز دارید و می‌خواهید بیشترین بهره‌وری را از دریافت داده‌ها ببریدGraphQL میتونه گزینه‌ی مناسبی باشه. یکی از ویژگی‌های کلیدی GraphQL، کنترل دقیق‌تر بر روی داده‌های درخواست‌شده است. این ویژگی باعث می‌شود داده‌های اضافی منتقل نشود و فقط اطلاعات مورد نیاز بازگردانده شود. ویژگی load balancing و همچنین این واقعیت که gRPC به طور پیش فرض از HTTP2 استفاده می کند، تاخیر در gRPC را بسیار کمتر از API های REST می کند.

این تفاوت‌های کلیدی به تیم‌های توسعه اجازه می‌دهد تا برنامه‌های با ثبات‌تری را ارائه دهند و این کار را سریع‌تر و با مشکلات کمتری انجام دهند. سازمان‌هایی که از GraphQL استفاده می‌کنند می‌توانند کیفیت برنامه‌های کاربردی و تجربه توسعه‌دهنده‌شان را بسیار بهبود بخشند (همانطور که توسعه‌دهندگان خودمان می‌توانند تأیید کنند). برخلاف REST، GraphQL این امکان را به توسعه‌دهندگان می‌دهد تا دقیقاً مشخص کنند که چه داده‌هایی را نیاز دارند. این ویژگی باعث می‌شود برنامه‌ها انعطاف بیشتری داشته باشند و از بازگشت داده‌های غیرضروری جلوگیری شود. سیستم schema مورد استفاده در GraphQL چیزی است که همه کارها را ممکن می سازد. زبان پرس و جو GraphQL همه چیز در مورد انتخاب فیلدها در اشیایی است که می خواهید پرس و جو کنید.

درست است که هر دوی این‌ها دو معماری برای طراحی WEBAPI هستند؛ اما این دو معماری، دارای مجموعه‌ای از تفاوت‌ها هستند که شما می‌توانید با دانستن آن‌ها، انتخاب بهتری بین این دو داشته باشید. در اغلب موارد پیش می‌آید که برنامه‌ نویسان هنگام انتخاب یک معماری برای طراحی و ساخت API، بین REST و graphQL تردید دارند و پروسه انتخاب برای آن‌ها سخت می‌شود. برای دریافت مشاوره و ثبت درخواست طراحی اپلیکیشن مورد نظر خود، با کارشناسان شرکت وب نگاه تماس بگیرید. API های GraphQL طرحی دارند که به زبان تعریف اسکیمای خود (SDL) نوشته شده است که از انواع و فیلدها تشکیل شده است. شما می توانید تمام داده ها را در یک GraphQL API با توصیف آنچه می خواهید با یک کوئری واکشی کنید. نوع ها شکل داده ها و فیلدهای آن را مشخص می کنند و فیلدها نشان دهنده داده هایی هستند که می توانید کوئری کنید.

علاوه بر این، واکشی دقیق داده‌ها، بهینه‌سازی کوئری را دشوار می‌کند، که می‌تواند هنگام توسعه برنامه‌های کاربردی پیچیده، مشکل‌ساز باشد. TRPC سریال‌سازی و سریال‌زدایی داده‌ها را بین کلاینت و سرور خودکار می‌کند و به شما این امکان را می‌دهد تا متد های API و داده‌های درخواست/پاسخ را در یک سینتکس ساده و قابل خواندن تعریف کنید. به این ترتیب، وقتی کلاینت ها درخواست می‌کنند، لازم نیست نگران جزئیات سطح پایین باشید. هیجان انگیزترین بخش GraphQL توانایی آن در ارائه تمام داده ها در یک نقطه پایانی است. کلاینت‌ها از دستگاه‌های مختلف درخواست می‌کنند و GraphQL درخواست‌های آنها را رسیدگی می‌کند و فقط داده‌های درخواستی آن‌ها را برمی‌گرداند. این به طور منظم مشکل واکشی بیش از حد و کم واکشی را در API های RESTful حل می کند.

استراتژی به مراتب بهتر این است که به طور کامل به GraphQL متعهد شوید و از همان ابتدا آن را به درستی پیاده سازی کنید. معرفی یک محیط گرین فیلد GraphQL مبتنی بر بهترین شیوه ها، هدیه ای به سازمان آینده شماست. کار کردن و ایمن کردن آن هم اکنون و هم در آینده آسان‌تر است، فوراً سود حاصل از تلاش را به همراه دارد، و مقیاس‌بندی و رسیدن به اهداف نقشه راه را بسیار آسان‌تر و سریع‌تر می‌کند. اما پذیرش GraphQL شامل چند دام است که می‌تواند باعث شود پیاده‌سازی‌ها به اهداف خود نرسند. آن‌ها به استراتژی‌های اندیشیده‌شده‌ای نیاز دارند که با بهترین شیوه‌های فعلی همسو باشد. در کنار فناوری REST API قدیمی، GraphQL با توانمندسازی برنامه‌ها برای جمع‌آوری، مزیت‌های دگرگونی را ارائه می‌کند.

برای آشنایی با نحوه پیاده سازی GraphQL در لاراول این مقاله را بررسی کنید، و برای نحوه واکشی داده ها در React با GraphQL نیز این مقاله را بررسی کنید. REST API به دلیل تفکیک منابع و اصول ساده آن، برای پروژه‌های کوچک و ساده مناسب است. در پروژه‌های بزرگ‌تر، ممکن است با افزایش تعداد endpointها و پیچیدگی درخواست‌ها، مدیریت API مشکل شود. از طرف دیگر، GraphQL با ارائه یک endpoint واحد و پرس‌وجوهای منعطف، می‌تواند برای پروژه‌های پیچیده و بزرگ مناسب‌تر باشد. در REST، هر منبع داده یک endpoint مخصوص به خود دارد و کلاینت برای هر نوع داده باید به یک URL خاص مراجعه کند. اما در GraphQL، همه داده‌ها از طریق یک endpoint واحد قابل دسترسی هستند و کلاینت می‌تواند دقیقاً مشخص کند که چه داده‌هایی را نیاز دارد.

اگرچه هنوز جوان است، اما میزان پذیرش و منابع آن به سرعت در حال رشد است، و منابع در حال حاضر برای کسانی که علاقه مند به یادگیری آن هستند، فراوان است. فیس بوک GraphQL را ایجاد کرد و از سال 2012 از آن در تولید برای تقویت برنامه های تلفن همراه خود استفاده کرد. این شرکت شبکه اجتماعی چند میلیارد دلاری مشخصات GraphQL را در سال 2015 منبع باز کرد و آن را در بسیاری از محیط ها و برای تیم هایی با اندازه های مختلف در دسترس قرار داد. کش کردن پاسخ‌های REST API به دلیل وجود URL‌های ایستا بسیار آسان‌تر است و می‌توان از روش‌های مختلفی مانند HTTP Caching برای بهینه‌سازی عملکرد استفاده کرد. GraphQL REST امکان انعطاف‌پذیری کوئری بسیار بیش‌تری را نسبت به REST فراهم می‌کند. هنگامی که این اتصال راه‌اندازی شد، کلاینت‌ها می‌توانند کوئری‌های اشتراک خود را به سرورهایی که از آن استفاده می‌کنند ارسال کنند.

در پروژه‌های بزرگ با تعداد زیادی منابع و endpoint، مدیریت و نگهداری API ممکن است چالش‌برانگیز شود. به خصوص اگر نیاز به سفارشی‌سازی داده‌های مختلف برای کلاینت‌های مختلف باشد. کلاینت ممکن است داده‌های بیشتری از نیاز خود دریافت کند (over-fetching) یا داده‌های کافی دریافت نکند و نیاز به درخواست‌های اضافی باشد (under-fetching). اگر پروژه‌ای با تعداد منابع محدود و درخواست‌های ساده دارید، REST API انتخاب مناسبی است. تنها منبع حقیقت؛ توسعه‌دهنگان رابط کاربری برای دسترسی به کل داده‌های پشت گراف یک شرکت فقط باید از یک اندپوینت مطلع باشند.

با استفاده از REST، شما می‌توانید با استفاده از URL به منابع دسترسی داشته باشید، و از این رو خواهید توانست که در سطح منبع cache کنید؛ زیرا شما URL منبع را به عنوان یک مشخص کننده دارید. در GraphQL، با توجه به این که هر کوئری حتی با وجود این که بر روی موجودیت مشابهی فعالیت می‌کند، می‌تواند متفاوت باشد، این مسئله پیچیده می‌شود. GraphQL یک زبان کوئری برای APIها و یک runtime برای انجام آن کوئری‌ها با داده‌های موجود شما است. GraphQL یک تعریف کامل و قابل درک از داده‌ها در API شما فراهم می‌کند و همچنین به کلاینت‌ها قدرت این را می‌دهد که بپرسند دقیقا چه چیزی می‌خواهند، و نه بیشتر... این رویداد همچنین برای کشف بخشی از برنامه ما که نیاز به بهینه سازی داشت، ارزشمند بود.

JSON، که REST از آن استفاده می کند، تقریباً توسط همه زبان ها پشتیبانی می شود. GRPC با پشتیبانی از مرورگر خارج از جعبه همراه نیست، اگرچه راه‌حل‌هایی برای آن وجود دارد. شما باید از gRPC-Web استفاده کنید که پسوند gRPC برای وب است و بر اساس HTTP 1.1 است. همه ویژگی های gRPC را ارائه نمی دهد، اما اگر می خواهید از gRPC در مرورگر استفاده کنید، مورد خوبی است. برای مثال، زمانی که در حال استفاده است، یک درخواست GET می‌تواند روی یک URI که معمولاً شبیه /api/users است انجام شود. امروزه از REST به عنوان استانداردترین روش توسعه Web API نام می‌برند و براساس تاریخچه و تجربیات متفاوتی که این معماری داشته باید بگوییم که در بسیاری از حالت‌ها به صورت موفقیت آمیزی کارها را به پیش برده است.

همچنین، اگه تعداد درخواست‌های زیاد و پهنای باند محدود دارید، بهتره از REST استفاده کنید به این دلیل که می‌تونید با استفاده از قابلیت کش کردن ، عملکرد رو در چنین شرایطی بهبود بخشید. APIهای REST از هدرهای مربوط به کش کردن HTTP پشتیبانی می‌کنند و از متودهای  HTTP (POST، GET، PUT، PATCH و DELETE) برای تغییر دیتا استفاده می‌کنن. هرکسی می‌تونه به راحتی با REST شروع به کار کردن کنه به این دلیل که بسیار ساده هستش وبه راحتی میشه یاد گرفت. GraphQL در پروژه‌های کوچک ممکن است به دلیل پیچیدگی بیشتر از حد نیاز باشد. همچنین پیاده‌سازی و نگهداری آن به دانش بیشتری نسبت به REST نیاز دارد.

API های توسعه یافته با REST با نام RESTful API یا REST API شناخته می شوند. GraphQL یک فناوری جدیدتر است که از یک نقطه پایانی برای پاسخ دادن به کوئری ها استفاده می کند، در حالی که REST از مجموعه ای از نقاط پایانی استفاده می کند که به درخواست های HTTP خاص پاسخ می دهند. GraphQL به طور کلی کارآمدتر و انعطاف پذیرتر از REST در نظر گرفته می شود. در REST API، ممکن است درخواست‌های بسیاری برای منابع مختلف ارسال شود که موجب over-fetching یا under-fetching داده‌ها می‌شود. در over-fetching، کلاینت داده‌های غیرضروری دریافت می‌کند و در under-fetching، ممکن است داده‌های کافی دریافت نشود و نیاز به درخواست‌های اضافی باشد.

«سه عامل اصلی در فروش و ارائه GraphQL وجود دارد که آن‌ها در The Software House، از نظر ما مهم هستند. در اینجا User همان شی است و در داخل آن فیلدها یا خواصی را که شیء دارد از جمله انواع داده را مشخص می کنیم. این بدان معناست که در هر پرس و جوی که بر روی شی User عمل می کند، تنها فیلدهایی که می توانند ظاهر شوندname و age هستند. برای هر دوی این فیلدها، تنها نوع داده ای که می توان روی آن نوشت یا خواند، به ترتیب رشته ها و اعداد هستند. البته این موارد حکم نهایی نبوده و شما بنابر درک خود از پروژه و ساختار آن ممکن است به صورت دیگری عمل کرده و خروجی مناسبی نیز دریافت کنید. از آنجایی که GraphQL با بسیاری از حالت‌ها منعطف بوده و قابلیت ادغام شدن با بیشتر زبان‌ها و دیتا سورس‌ها را دارد به عنوان یک ابزار مناسب در جهت توسعه APIهای پیچیده می‌توان آن را در نظر گرفت.

استفاده از GraphQL شامل برخی از چالش‌هایی می‌شود که انجام بعضی عملیات‌ها را نسبت به REST سخت‌تر می‌کند. برای مثال، caching در APIهای براساس REST نسبت به APIهایی که براساس GraphQL هستند، بسیار آسان‌تر است (حتی با توجه به این که این روز‌ها از وجود dataloader برخوردار هستیم). اما بیشترین رشد و میزان محبوبیت GraphQL را می‌توانید در نمودار زیر، که نشان‌دهنده رشد و کسب محبوبیت آن در بازه ۴ ساله ۲۰۱۶ تا ۲۰۲۰ است، مشاهده کنید. هدف از راه‌اندازی سایت EngineDevOps.com ، ایجاد مرجعی جامع برای آموزش کوبرنتیز، داکر و ابزارهای DevOps است. ما بر این باوریم که کسب دانش و مهارت‌های لازم در این حوزه نه تنها موجب پیشرفت فردی می‌شود، بلکه به‌طور چشمگیری در ارتقاء سطح فناوری و بهینه‌سازی فرآیندهای کاری در صنایع مختلف تأثیرگذار خواهد بود. در این مقاله سعی کردیم تا شما را با GraphQL و REST‌ آشنا کنیم و سپس به انتخاب یکی از این موارد بپردازیم.

GraphQL می‌تواند برای کوئری کردن داده‌ها در هر موقعیتی استفاده شود؛ شامل کلاینت به کلاینت با استفاده از Apollo Link State یا حتی در طی یک روند ساخت استاتیک با استفاده هاز Gatsby. وقتی که یک فیلد خاص قرار است منسوخ شود، یک کلاینت خطای منسوخ کردن را در هنگام کوئری کردن فیلد دریافت خواهد کرد. پس از مدتی که کلاینت‌های زیادی از فیلد منسوخ شده استفاده نمی‌کنند، ممکن است این فیلد از طرح حذف شود. اکثر مواقع برای انجام این کار، این backend به چند میکروسرویس با عملکردهای متمایز تقسیم می‌شود. به این صورت، اختصاص دادن عملکردهایی خاص به میکروسرویس از طریق چیزی که آن را «دوختن طرح» می‌نامیم، ساده می‌شود.

شما درباره tRPC و GraphQL، ویژگی‌های آن‌ها، مزایا و معایب آن‌ها و پروژه‌هایی که برای آنها مناسب‌تر هستند، یاد گرفته‌اید. در نهایت، انتخاب بین tRPC و GraphQL به نیازهای خاص پروژه شما و مهارت ها و تجربه تیم توسعه شما بستگی دارد. GraphQL یک انتخاب عالی برای توسعه برنامه های موبایل و وب است که به انعطاف پذیری و کارایی نیاز دارند. API های GraphQL سازگار و قابل پیش بینی هستند، بنابراین نگهداری از آنها در طول زمان آسان است. دلایل اصلی اینکه چرا می خواهید از tRPC به عنوان فناوری API برای برنامه خود استفاده کنید، سهولت استفاده و عملکرد و مقیاس پذیری آن است. با یک نمودار فدرال، APIها یک نمودار داده واحد را نشان می دهند که چندین زیرگراف را ترکیب می کند (و مبهم می کند).

این درخواست تنها عنوان، محتوا و تاریخ پست‌ها را واکشی می‌کند، که این یکی از مزیت‌های اصلی GraphQL نسبت به REST API است، زیرا تنها داده‌های ضروری ارسال می‌شود. برای استفاده از GraphQL در وردپرس، بهترین گزینه استفاده از پلاگین WPGraphQL است. این پلاگین به‌صورت رایگان در دسترس است و به شما اجازه می‌دهد تا از GraphQL برای واکشی داده‌های وردپرس استفاده کنید. در مقابل، وقتی ما برای دریافت داده ها از graphQL استفاده می‌کنیم، می‌توانیم مشخص کنیم که چه نوع داده‌ای مورد نظر ما است؛ مثلا می‌توانیم مشخص کنیم که در یک ستون مشخص سن و در ستونی دیگر نام کاربر را می‌خواهیم. این موضوع باعث شده است تا افرادی که با داده‌های زیادی سر و کار دارند، معماری graphQL را به REST ترجیح دهند.

GraphQL از یک سیستم نوع قوی برای تعریف قابلیت های API استفاده می کند. در GraphQL، زبان تعریف اسکیما (SDL) برای تعریف پارامترهای پیرامون نحوه دسترسی کلاینت به داده های سرور استفاده می شود. همه APIهایی که در معرض کلاینت قرار می گیرند در SDL نوشته می شوند و مشکل ناسازگاری داده ها را که در API های RESTful مشاهده می شود حل می کند. مشکل واکشی بیش از حد می‌تواند منجر به مصرف پهنای باند بالاتر برای کلاینت‌ها شود که ممکن است به مرور زمان باعث تاخیر در برنامه شما شود. استفاده از الگوهای طراحی RESTful API برای مرتب کردن اطلاعات مورد نیاز از یک بار عظیم زمان‌برتر است. بسیاری از شرکت های میلیارد دلاری دیگر مانند Intuit، Shopify، Coursera و Airbnb برنامه های خود را با GraphQL تامین می کنند.


برنامه نويسي پايتون