Anophel-آنوفل GraphQL چیست؟ معرفی کامل و کاربردهای آن

GraphQL چیست؟ معرفی کامل و کاربردهای آن

انتشار:
2
0

در سال های اخیر، توسعه اپلیکیشن بسیار پیچیده شده است. روزهایی که صرفاً برخی از داده ها را از پایگاه داده بیرون می کشید و متنی را در یک صفحه با فرم نمایش می داد، گذشته است. امروز، ما از توسعه‌دهندگان برنامه‌ها می‌خواهیم که رابط‌های کاربری غنی و پیچیده بسازند و تجربیات وب به یاد ماندنی را از منابع مختلف ایجاد کنند.

متأسفانه، با افزایش پیچیدگی، سبک‌های API سنتی مانند REST می‌توانند کار با آن‌ها را دشوار کنند. و GraphQL وارد بازی می شود.

در این مقاله، در مورد اینکه GraphQL چیست، از کجا آمده است، چگونه کار می‌کند و چه مزایایی نسبت به رویکردهای سنتی برای ساخت و نگهداری API دارد، خواهیم آموخت.

GraphQL چیست؟

GraphQL یک زبان کوئری منبع باز است که توضیح می دهد چگونه یک کلاینت باید اطلاعات را از طریق یک API درخواست کند. در یک مفهوم گسترده، GraphQL یک نحوی است که توسعه دهندگان می توانند برای درخواست داده های خاص و برگرداندن آن داده ها از منابع متعدد استفاده کنند. هنگامی که کلاینت ساختار داده های مورد نیاز را تعریف می کند، سرور داده ها را با استفاده از ساختار یکسان برمی گرداند.

GraphQL اولویت را به کلاینتان می دهد دقیقاً داده هایی را که آنها درخواست می کنند و نه بیشتر.

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

GraphQL از طریق HTTP

 

شباهت های GraphQL و REST چیست؟

هر دو GraphQL و REST سبک‌های معماری API محبوبی هستند که امکان تبادل داده بین سرویس‌ها یا برنامه‌های مختلف را در مدل کلاینت-سرور فراهم می‌کنند.

API ها دسترسی به داده ها و عملیات داده مانند زیر را تسهیل می کنند:

یک کلاینت یک درخواست API را به یک نقطه پایانی یا چندین نقطه پایانی در یک سرور ارسال می کند
سرور پاسخی می دهد که حاوی داده، وضعیت داده یا کدهای خطا است
 

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

تیم های Frontend و Backend از این معماری های API برای ایجاد برنامه های ماژولار و در دسترس استفاده می کنند. استفاده از معماری API به حفظ امنیت، ماژولار و مقیاس پذیر سیستم ها کمک می کند. همچنین باعث می شود سیستم ها کارایی بیشتری داشته باشند و ادغام آنها با سیستم های دیگر آسان تر شود.

تفاوت بین GraphQL و REST چیست؟

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

اسکیما ها، حل کننده ها و سایر اصطلاحات رایج GraphQL

توسعه دهندگان API از GraphQL برای ایجاد طرحی برای توصیف تمام داده های احتمالی که کلاینتان می توانند از طریق آن سرویس جستجو کنند، استفاده می کنند.

یک اسکیما GraphQL از انواع شی تشکیل شده است که مشخص می کند کدام نوع شی را می توانید درخواست کنید و چه فیلدهایی دارد.

با ورود کوئری ها، GraphQL کوئری ها را در مقابل اسکیما اعتبارسنجی می کند. سپس GraphQL کوئری های تایید شده را اجرا می کند.

توسعه دهنده API هر فیلد در یک اسکیما را به تابعی به نام حل کننده (resolver) متصل می کند. در حین اجرا، حل کننده برای تولید مقدار فراخوانی می شود.

جدا از تعریف و اعتبارسنجی سینتکس برای کوئری های API (که در مخزن graphql-spec مشخص شده است)، GraphQL اکثر تصمیمات دیگر را به طراح API واگذار می کند. 

GraphQL هیچ جهتی برای نحوه ذخیره داده ها یا زبان برنامه نویسی برای استفاده ارائه نمی دهد، توسعه دهندگان می توانند از PHP (graphql-php)، Scala (Sangria)، Python (Grapene Python)، Ruby (graphql-ruby)، JavaScript (graphql.js) استفاده کنند و موارد دیگر. GraphQL هیچ الزامی برای شبکه، مجوز یا صفحه بندی ارائه نمی دهد.

از دیدگاه کلاینت، رایج‌ترین عملیات GraphQL احتمالاً کوئری‌ها و mutations هستند. اگر بخواهیم در مورد آنها از نظر مدل ایجاد، خواندن، به روز رسانی و حذف (CRUD) فکر کنیم، یک کوئری  معادل خواندن خواهد بود. همه موارد دیگر (ایجاد، به روز رسانی و حذف) توسط mutations کنترل می شوند.

برای مثال کد زیر یک نمونه از اسکیمای گراف کیوال می باشد:

`type query {
    teacher
    students {
      name
    }
  }
}`

می بینید که اسکیما دارای دو فیلد teacher و students  است.

اگر برنامه ای بخواهد از طریق یک API سنتی REST به نام students  و teacher آنها دسترسی پیدا کند، یک کوئری در برابر URL API اجرا می کند و API ممکن است نام teacher، تعداد students  در کلاس، موضوع کلاس را برگرداند. 

به عبارت دیگر، کلاینت اطلاعات بیشتری از آنچه نیاز دارد خواهد داشت. با این حال، اگر این طرح در سرویس GraphQL تعریف شده باشد و برنامه کوئری را اجرا کند، برنامه فقط آنچه را که می‌خواست دریافت می‌کند: نام students  و teacher . خروجی ممکن است چیزی شبیه به این باشد:

`{
   "data": {
     "teacher”: "Joe Bloggs",
     "students": [
       {
         "name": "Jane Doe"
       },
       {
         "name": "Joe Smith"
       },
       …
    ]
  }
}`

مزایا و معایب GraphQL در محیط های شرکتی

آیا به آزمایش GraphQL در یک محیط تجاری یا سازمانی فکر می کنید؟ هم مزایا و هم معایب دارد.

مزایای

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


معایب

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

GraphQL و متن باز

GraphQL توسط فیسبوک توسعه داده شد، که اولین بار در سال 2012 استفاده از آن را برای برنامه های تلفن همراه آغاز کرد. مشخصات GraphQL در سال 2015 منبع باز بود. اکنون توسط بنیاد GraphQL نظارت می شود.

پروژه های متن باز متنوعی وجود دارد که شامل GraphQL می شود. لیست زیر جامع نیست، اما شامل پروژه هایی است که برای تسهیل پذیرش GraphQL طراحی شده اند.

آپولو، یک پلتفرم GraphQL که شامل کتابخانه سرویس گیرنده frontend (Apollo Client) و چارچوب سرور بک اند (Apollo Server) است.
Offix، یک کلاینت آفلاین که به جهش‌ها و کوئری‌های GraphQL اجازه می‌دهد حتی زمانی که یک برنامه غیرقابل دسترسی است اجرا شوند.
Graphback، یک سرویس گیرنده خط فرمان برای تولید سرورهای Node.js با قابلیت GraphQL.
OpenAPI-to-GraphQL، یک رابط خط فرمان و کتابخانه برای ترجمه APIهای توصیف شده توسط OpenAPI Specifications یا Swagger به GraphQL.

GraphQL چگونه کار می کند؟

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

اگر می خواهید بین GraphQl، REST و gRPC کدام را برای API انتخاب کنیم می توانید این مقاله را بررسی کنید.
 

پذیرش GraphQL

قابل درک است که از آنجایی که نیاز به چنین راه حلی در صنعت بسیار رایج بود، پذیرش GraphQL به شدت افزایش یافت. در عرض نیم سال قبلاً GraphQL در زبان‌های مختلف از جمله PHP، JavaScript، Python، Scala و Ruby پیاده‌سازی شده بود.

GraphQL که به‌عنوان یک ویژگی «سرگرمی» شروع شد، به سرعت اعتبار سازمانی را به دست آورد و توسط شرکت‌هایی مانند GitHub، Yelp، AirBnB و بسیاری دیگر مورد استفاده قرار گرفت.

GraphQL Landscape یک جدول پذیرش GraphQL را نشان می دهد که بیش از 116 هزار ستاره، ارزش بازار 4.7 تریلیون دلار و بودجه بیش از 9 میلیارد دلار را پوشش می دهد.

بین تمام سرورها، کلاینت‌ها، دروازه‌ها و برنامه‌های GraphQL، اکوسیستم GraphQL از نظر پذیرش بازار منفجر شده است و جایگاه GraphQL را به‌عنوان نیرویی برای محاسبه ادعا می‌کند.

مثال تنظیم کلاینت GraphQL:

در کار روزانه خود، در واقع نیازی به نگرانی در مورد درخواست ها و پاسخ های HTTP اصلی ندارید.

درست مانند زمانی که با یک REST API کار می کنید و از یک کلاینت HTTP برای کاهش فشار در برقراری تماس های API و رسیدگی به پاسخ ها استفاده می کنید، می توانید یک کلاینت GraphQL را انتخاب کنید تا نوشتن کوئری های GraphQL، ارسال آنها و رسیدگی به پاسخ ها را بسیار آسان تر کنید.

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

در اینجا یک تنظیم معمولی کلاینت GraphQL و ایجاد یک کوئری به نظر می رسد:

// Setup a GraphQL client to use the endpoint

const client = new Client("https://myapi.com/graphql");


// Now, send your query as a string (Note that ` is used to create a multi-line
// string in javascript).

client.query(`
  query {
    user {
      id
      name
    }
  }`);

 

توجه داشته باشید که می توانید یک تماس API GraphQL با استفاده از API Fetch جاوا اسکریپت ساده برقرار کنید و در واقع برای موارد استفاده ساده به کلاینت GraphQL نیاز ندارید.

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

 

موارد استفاده از GraphQL

اپلیکیشن های موبایل و وب
GraphQL کارایی و قدرت را برای برنامه های موبایل و وب به ارمغان می آورد. GraphQL با ارائه یک نقطه پایانی برای جستجوی داده ها بدون درخواست های متعدد به سرور، می تواند به معنای کاهش زمان بارگذاری و تجربه کاربری بهتر باشد.

داشبوردهای Real-time و تجمیع داده ها
آیا علاقه مند به نظارت بر داده های خود در هنگام تغییر هستید؟ استفاده از GraphQL برای ایجاد برنامه‌های داشبورد Real-time می‌تواند راه‌حلی برای همگام شدن با مجموعه‌های داده‌ای که دائماً در حال تکامل هستند ارائه دهد. پیاده سازی GraphQL همچنین ادغام چندین منبع داده در یک نمای ساده را تسهیل می کند و تجزیه و تحلیل کلی بهتر را تسهیل می کند.

تجمیع و نسخه سازی API
GraphQL را می توان برای ترکیب چندین API در یک نقطه پایانی GraphQL استفاده کرد. این امر ردیابی نسخه‌های مختلف APIها را آسان‌تر می‌کند و راهی برای نسخه‌سازی داده‌ها فراهم می‌کند.

کش داده ها
GraphQL را می توان برای کش کردن داده ها در سمت کلاینت برای تسریع زمان بارگذاری استفاده کرد.

بهترین شیوه های GraphQL


1. از ثبات نام در اسکیما اطمینان حاصل کنید

نام‌گذاری مداوم در اسکیما های GraphQL شناسایی داده‌ها را آسان‌تر و کارآمدتر می‌کند. اگر نام‌گذاری اسکیما را تنظیم نکنید و به استاندارد خاصی پایبند نباشید، می‌توانید نام‌ها یا ویژگی‌های مختلفی را در یک اسکیما پیدا کنید که به داده‌های مشابهی اشاره می‌کنند. این می تواند مشکلات بیشتری در مسیر ایجاد کند.

اطمینان حاصل کنید که قراردادهای نامگذاری برای فیلدها، انواع داده ها، صفحات و غیره کارآمد هستند و همیشه از استانداردهای یکسانی پیروی می کنند. یک قرارداد نامگذاری خوب برای استفاده با GraphQL، camelCase برای فیلدها و PascalCase برای انواع است.


2. اصلاحات آتی اسکیما را در نظر بگیرید

اسکیما های GraphQL قطعا در آینده تغییر خواهند کرد. در طراحی معماری باید به این موضوع توجه کرد. اگر برنامه وب شما رشد کند و نیاز به اضافه کردن داده ها و فیلدهای بیشتری به اسکیما خود داشته باشید، چه؟ اطمینان حاصل کنید که فضایی برای اصلاحات و افزونه‌ها وجود دارد، در غیر این صورت ممکن است مجبور شوید تغییراتی را در مراحل بعدی ایجاد کنید. ممکن است لازم باشد کل اسکیما خود را مجدداً ترسیم کنید، منابع و زمان خود را هدر دهید.


3. قطعات غیر منطقی را حذف کنید

در GraphQL، قطعات قطعات منطقی هستند که می توانند به طور همزمان بین کوئری ها و جهش ها به اشتراک گذاشته شوند. قطعات به اطمینان از اینکه هر کوئری کوتاه، خوانا و سازگار است کمک می کند. متأسفانه، برخی از قطعات در صورت عدم استفاده صحیح می توانند آسیب بیشتری نسبت به فایده داشته باشند.

یک راه برای اطمینان از اینکه همه قطعات واقعاً مورد نیاز هستند، استفاده از آنها فقط در فیلدهای اسکیما ای است که معنای منطقی دارند. افزودن قطعات به اشتباه یا غیرمنطقی می تواند نتیجه معکوس داشته باشد و خواندن یک کوئری را سخت کند.


4. از استدلال های سخت کد شده خودداری کنید

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

علاوه بر خطرات آشکار حریم خصوصی پارامترهای رمزگذاری شده، مشکلات ذخیره سازی نیز وجود دارد. هنگام تلاش برای کش کردن درخواست‌های API، پارامترهای رمزگذاری شده می‌توانند فضا را اشغال کنند و عملکرد کلی حافظه پنهان را کاهش دهند.


5. یک برنامه رسیدگی به خطا ایجاد کنید

برنامه های کاربردی مدرن باید انتظار شکست را داشته باشند و برای مدیریت شکست ساخته شوند. مدیریت خطا یک اسکیما پشتیبان برای پاسخگویی به خطاها و ارائه راه حل های بازیابی است.

از همان ابتدا مدیریت خطا را ایجاد کنید تا اطمینان حاصل کنید که برنامه شما همیشه پاسخ بارگذاری معتبری دارد، حتی در سناریوهای خرابی و با رشد و مقیاس شدن. این می‌تواند به توسعه‌دهندگان و کارکنان عملیاتی که روی سیستم کار می‌کنند اجازه دهد تا اشتباه را مشخص کنند.

نتیجه

GraphQL یک زبان کوئری  و یک زمان اجرا سرور است که معمولاً از طریق HTTP اجرا می شود و طراحی شده است تا کارآمدتر باشد و تجربه توسعه دهنده بهتری را برای کار با داده ها در معماری کلاینت-سرور ارائه دهد.


پذیرش GraphQL از زمانی که برای اولین بار منبع باز شد رشد قابل توجهی داشته است و به نظر نمی رسد که به این زودی ها راه پیدا کند.
 

#api#graphql#rest#restful
نظرات ارزشمند شما :
Loading...