آموزش استفاده از graphQL
همیشه مشکل هایی با API وجود داشته که توسعه دهندگان را آزار میدهد:
- وجود endpoint های متفاوت
- نسخه های متفاوت هر API
- درخواست های متعدد
- داده های زیاد که نیازی به آن ها نداریم
- مستند سازی هر endpoint و پارامتر های آن
برای حل هرکدام از مشکلات بالا در RestAPI راه حل هایی ارائه شده است.
شرکت های بزرگ نیز از این قاعده جدا نیستند فیس بوک اما عقب نکشیده است و راه حلی ارائه کرده است به نام graphql این رویکرد یک library یا یک فریم ورک نیست بلکه راه حلی برای ساخت api با ساختاری شبیه به graph است.
Graphql در اصل به جای اینکه api را در قالب endpoint های متعدد در نظر بگیرید آن ها را در قالب graph در نظر میگیرد.
فرض کنید یک اپلیکیشن وبلاگ دارید که کاربر، پست، کامنت، لایک دارد.
برای ساخت api احتمالا به صورت زیر عمل میکنید
/api/post
/api/posts/**POST_ID**
/api/posts/**POST_ID**/comments
/api/posts/**POST_ID**/likes
/api/comments/**POST_ID**
/api/users
/api/users/**USER_ID**
/api/likes/**POST_ID**
میبینیم که برای هر موجودیت یک سری endpoint وجود دارد فرض کنید هر کدام ازین endpoint ها یک سری param دریافت میکنند از قبیل تعداد و فیلتر کردن فیلدهاو…
مثالی برای درک موضوع بالا:
حتی ممکن است برخی از پارامتر ها با header تنظیم شود مثلا url صفحه قبلی و بعدی به صورت http header باشد.
میبینیم مشکلاتی زیادی بر سر راه وجود دارد که چیز هایی که توضیح داده شد فقط قسمتی از آن ها هستند.
استفاده از graphQL برای حل مشکلات فوق
هدف graphql حل این موارد است.
در graphql شما داده را به صورت graph میبینید و حتی به صورت Graph درخواست میکنید
نکته: graph ها را در graphql به صورت json در نظر میگیریم
شروع به کار:
فرض کنید میخواهیم در یک api که با GraphQL نوشته شده است پست ها را دریافت کنیم به صورت زیر عمل میکنیم:
Query:
{
post
}
حال اگر بخواهیم فیلد های مشخصی را دریافت کنیم به صورت زیر عمل میکنیم:
Query:
{
post {
title,
body,
userId
}
}
گفتیم که از موجودیت post فیلد های title, body, userID را دریافت کن.
فرض کنید میخواهیم پست هایی دریافت کنیم که ID نویسنده آن 10 باشد.
Query:
{
post(userID: 20) {
title,
body
}
}
با امکان فوق میتوانیم pagination را نیز پیدا سازی کنیم مثلا بگوییم count را مساوی 10 قرار بده.
Query:
{
post(userID: 20, count: 10, offset= 20) {
title,
body
}
}
فرض کنید میخوایم در کنار هر اطلاعات کاربر نیز موجود باشد.
Query:
{
post(userID: 20) {
title,
body,
user: {
name,
family,
username,
}
}
}
همین کار را میتوانیم برای comment نیز انجام دهیم.
چیز هایی که در بالا گفته شد دریافت اطلاعات از یک سرور GraphQL است برای اطلاعات بیشتر میتوانید به سایت زیر مراجعه کنید:
http://graphql.org/
در قسمت بعد نحوه پیاده سازی همین api را با graphql آموزش خواهیم داد.