برام مواردی پیش اومدن که لازم بوده برای کسی در مورد گرافکیوال یا GraphQL توضیح بدم. اینکه چرا خوبه و کجاها میتونه خیلی کمک کنه.
من اینجا اول در مورد خود گرافکیوال توضیح میدم، و تو قدم بعدی نحوهی پیاده سازی یک سرور گرافکیوال رو.
خیلی خلاصه «یه زبان کوئری گرفتن برای ایپیآی». ولی این توضیح هم خیلی کوتاهه هم اطلاعات کافی نمیده، مگه اینه اول بدونیم کامل خود گرافکیوال چی هست.
گرافکیوال یه زبانه برای ایپیآی که با دادن یک توضیح کامل از دیتایی که مد نظرتون هست، اونچه که خواستید رو در اختیارتون میذاره. در واقع به کلاینت کمک میکنه تا دقیقا بگه که چه چیزی رو میخواد و دقیقا همونچیز رو برمیگردونه.
فرض کنیم که یه ایپیآی مبتنی بر REST داریم. همچین چیزی:
GET /products
برای یادآوری، این سبک نوشتن یعنی شما یک درخواست GET رو مثلا به یه آدرسی مثل http://localhost:3000/products میفرستید.
درخواست رو براش میفرستیم و همچین جوابی میگیریم:
[ { "id": 1234, "name": "Aspire M5", "brand": "Acer", "category": "Laptop and Computers", "features": { "weight": 1.23, "dimensions": { "height": 23.4, "width": 18.5, "length": 18.3 } }, "specs": { "ram": 16, "cpu": 3.5, "cpu_count": 8, "thread_count": 8 }, "price": 699.99 }, {...} ]
خب اینا اطلاعات یه سری لپتاپ هستن (مثلا) و ما میخوایم اینارو تو صفحه محصولاتمون نشون بدیم. اما ایده اینه که تو صفحهی اصلی، تمام اطلاعات لپتاپها رو نذاریم، بلکه فقط مواردی که مورد نیاز ما هستن رو نشون میدیم. مثلا اسم لپتاپ و قیمتش. بعد که یوزر روی محصول کلیک کرد، مابقی اطلاعات رو نشون بدیم.
اینجا به دوتا نکته توجه کنید:
GET /products/1234
بفرستیم تا اطلاعات محصول رو مجدد دریافت کنیم.اینجا یکی از جاهاییه که گرافکیوال به کمک ما میاد!
گرافکیوال یک زبان کوئریه. یعنی باید بهش بگید دقیقا چی میخواید تا اونهم دقیقا همون رو بهتون بده. اما چطور این کار رو انجام بدیم؟ این دقیقا همون ویژگی اصلی گرافکیوال هست، یعنی شما انتخاب میکنی که چه فیلدهایی باید برای شما ارسال بشن. فکر کنم یه مثال بتونه خوب نشون بده که چطور میشه. تجسم کنید که ما توی گرافکیوال میتونیم چنین چیزی رو برای سرورمون بفرستیم:
query { products { id name price } }
و در جوابش سرور گرافکیوال به ما این رو میده:
[ { "id": 1234, "name": "Aspire M5", "price": 699.99 }, { ... } ]
به همین سادگی! اما سوال اینه که چطور میشه اطلاعات فقط یک لپتاپ رو بدست آورد؟
اینم خیلی سادست!
query { product(id: "1234") { id name brand category price features { weight dimensions { width height length } } specs { ram cpu cpu_count thread_count } } }
و جوابش:
{ "id": 1234, "name": "Aspire M5", "brand": "Acer", "category": "Laptop and Computers", "price": 699.99, "features": { "weight": 1.23, "dimensions": { "width": 18.5, "height": 23.4, "length": 18.3 } }, "specs": { "ram": 16, "cpu": 3.5, "cpu_count": 8, "thread_count": 8 } }
اما یک نکته دیگه راجع به گرافکیوال موند.
این قسمت خوب قضیست. توی گرافکیوال، دقیقا بر عکس ایپیآیهای REST، ما فقط یک Endpoint داریم که بهش درخواست میدیم. همینطور همهی این درخواستها رو فقط با یک Verb میفرستیم! یعنی دیگه خبری از Get
برای گرفتن اطلاعات، Post
برای ساختشون و مابقی برای بقیهی کارها نیست!
توی گرافکیوال همهی درخواستها به همچین آدرسی ارسال میشن:
POST /graphql
و نوع درخواست ما، یا همون Content-Type
که توی Header میذاریم، به جای application/json
، application/graphql
میشه.
در نتیجه سرور متوجه میشه که با یک درخواست گرافکیوال طرفه.
گرافکیوال، یک زبان مخصوص برای تعریف شکل دادههاست که سمت سرور اجرا میشه و خروجی لازم رو تحویل میده. چیزی که مهمه اینه که گرافکیوال برای خودش یک Type System داره که باید در موردش حتما بدونیم.
یک سرور گرافکیوال، اصولا با ساختن تایپها یا types شروع میشه که توی هر تایپ، فیلدهای خاصی وجود داره. در نهایت به هر فیلد، یک فانکشن تخصیص داده میشه که این اتفاق سمت موتور میوفته، ما فقط فانکشنها رو تعریف میکنیم و بهشون لاجیک میدیم.
برای مثلا، یک سرور گرافکیوال که که بهمون اطلاعات یک پست وبلاگ رو میده، حتما این دو تایپ رو داره:
type Query { post: PostType } type PostType { title: String comments_count: Int }
که شما در نهایت با فرستادن یک درخواست مثل
{ post { comments_count } }
میتونید یک جواب شبیه به
{ "post": { "comments_count": 43 } }
رو دریافت کنید...
ادامهی مطلب و آموزشهای کاملتر رو تو وبسایت خودم میتونید داشته باشید.