Graphql yoki Rest

Graphql yoki Rest


Bu postda sizlar bilan graphQL va Rest(Full) API haqida gaplashamiz. Maqsad, ikkalasini yaxshi va yomon taraflarini ko'rib o'rganib chiqish va o'zimning nega graphQL kelajakda rest API ning o'rnini egallashi mumkin ekanligini tushuntirib beraman.


To'xta-to'xta API o'zi nima? Gapni shundan boshlamaysanmi?

API (application programming interface) bu aslida keng tushuncha. U orqali sofware dasturlar bir biri bilan muloqot qiladi. Muloqot jarayoni biror datani bir dasturdan boshqasiga yetkazish yoki biror funksional imkoniyatni boshqa dasturga ishlatishi uchun ochib berilgan yo'l desak ham bo'ladi. Misol uchun, biror web-sayt yasalayotganda uning malumotlar omboridagi datani frontedga chiqarish uchun API kerak. Yoki bo'lmasa, operatsion tizimdagi web-camerga ulanish funksiyasini browserga WEB-API orqali taqdim qilish deb tushunsak ham bo'ladi. Xullas biz hozir gaplashadigan API bu backend va fronted orasida malumot almashish uchun ishlatiladigan API bo'ladi.

O'zi API larning tarixi qanday? Webda qanday APIlardan foydalanishgan?

Web olamida dasturlar, servislar 2000-yillargacha malum bir dizaynga ega bo'lmagan, yasashlik va foydalanish uchun anchagina qiyin bo'lgan SOAP va CORBA APIlaridan foydalanib kelishgan. Bular datani xml formatda almashgan va debug qilish ham juda qiyin bo'lgan. Keyin shu yillari Roy Thomas Fielding va uning jamoasi tomonidan RestFull API ishlab chiqilgan. Unda avvalgilaridagi muammolar bartaraf etilgan va yaxshigina strukturaga ega. Rest API haqida quyiroqda batafsil to'xtalaman. Xullas, vaqt o'tgani sari texnologiya rivojlanib avvalgisidan yaxshirog'i, uni kamchiliklarini to'ldirib yangi texnologiyalar ishlab chiqarilaveradi. GraphQL ham shunday. Facebook o'zining Instagram va Facebook dasturlarida restAPI bilan ishlashda juda ko'p muammolarga dush kelgan. Chunki bu dasturlarda murakkab va juda ko'p data bilan ishlanadi. restAPIda esa murakkab, katta datalar bilan ishlashda kamchiliklar bor, shuningdek unda APIdan keladigan malumotni avvaldan bashorat qilib bo'lmaydi va hokazo. Shuning uchun Facebook, o'zining dasturlarida ishlatish uchun GraphQLni 2012-yilda ishlab chiqdi. 2015-yilda esa, butun ommaga taqdim qildi. Umuman olganda bu APIlarning hammasining maqsadi xuddi bir davlatdan ikkinchi davlatga yuk tashiydigan kemalar kabi bir serverdan browserga yoki boshqa bir serverga datani yetkazib berish bo'lgan. Ikkinchi tomon (fronted) esa API dan kelgan malumotni foydalanuvchiga chiroyli ko'rinishda yetkazishi yoki undan boshqa maqsadda ham foydalanishi mumkin.

WEB app structure

Bu ikkalasining farqi nimada?

  • API ga ulanish. Rest API endpointlar ustiga quriladi. Agarda siz malumot olmoqchi bo'lsangiz bir endpointga, unga tegishli boshqa malumotni olmoqchi bolsangiz yana bir boshqa endpointga murojat qilasiz. Agarda bir hududdagi datani faqat bittasini olmoqchi bo'lsangiz aytaylik, foydalanuvchilardan faqat bittasining ma'lumotini, u ham alohida endpoint talab qiladi. Malumotni yozish, o'zgartirish uchun esa methodni ham o'zgartirasiz. Graphql bu borada boshqacharoq yo'ldan ketgan. Unda faqat bitta endpoint yoziladi va bitta method bo'ladi. Datani esa, xuddi javaScriptdagi objectdan uning propertilarini destruksiya qilib olgan kabi olish mumkin. Malumot yozish, o'chirish yoki o'zgartirish esa, xuddi biror funksiyani chaqirib unga argument kiritish kabi bo'ladi. Bular graphQL da query deb ataladi. graphQL aslida bitta kichik so'rov tili. Unining o'zini data tiplari, sintaksisi bor. Undan foydalanish uchun shu sintaksisdan foydalaniladi


  • API ni qurish. Rest API qurish uchun har bir endpoint kamida bittadan alohida funksiyalar(controllerlar)ni talab qiladi. Yana bir tarafi borki, Rest API da bir xil resursni har xil endpointlardan yuborish uchun, hamma controllerda databasega alohida so'rov yuboriladi va API orqali ketadigan dataga qaytadan ishlov beriladi. Misol uchun sizda quyidagi endpointlar bor:

Bu holatda tasavvur qiling, siz har to'rtta endpointda ham, foydalanuvchi malumotini qo'shib yuborishingiz kerak. Ya'ni postlarnining, commentning, bitta postning egasini va foydalanuvchilarning o'zining ma'lumotini. Shunda har bir endpointda ketadigan userga tegishli malumot databasedan alohida-alohida olinadi va har birida borishi kerak bo'lgan userninig ichki malumotlariga qaytadan ishlov beriladi. GraphQLda esa, umuman boshqacha struktura. Unda avvaldan har bir alohida resurs uchun tiplar elon qilinadi. Masalan User degan tip. Uning ichida qanday malumot bo'lishi va har bir malumotning data-tipi qanday bo'lishigacha belgilab chiqiladi. Biror tip yasalgandan keyin shu tip qayerda va necha marta ishlatilsa ham, unga faqat bitta funksiya xizmat ko'rsatadi va bir marta ishlov beriladi. Bu xuddi bitta universal biror instrument yasab qo'yib, uni istalgan joyda xoxlagancha ishlatishga o'xshaydi. Unga har bir ishlatiladigan case uchun alohida ishlov berish shart emas.

Book va Author tipi yasalgan
Book va Author tipi ishlatilgan
  • API dan keladigan data ko'rinishi. Har ikkala tur ham bir xil JSON formatda ma'lumot almashadi. Lekin restda siz keladigan datanining ichida qanday malumotlar borligi va ularning qanday data-tipda bo'lishini avvaldan bilmaysiz. Shuningdek, ularning eng asosiy farqi esa, Rest arxitekturasida har bir endpointdan qanday data va ular qanday ko'rinishida kelishini server belgilaydi. GraphQL da esa, siz serverda u maximal qanday data borligi, ularni tipi qandayligini va bir biriga qanday bog'langani elon qilib qo'yasiz, uni qay ko'rinishda, qancha miqdorda, qaysi qismlarini olishni esa, client hal qiladi. Ya'ni client faqat o'ziga tegishli ma'lumotnigina serverdan oladi. Ortiqcha data qo'shilib kelmaydi. Aytaylik, siz frontedga userlarning ismi va rasmini chiqarmoqchisiz, rest arxitekturasida sizga uning shu ikki malumotidan tashqari yana bir dunyo keraksiz malumotlari ham keladi, masalan: ishlaydigan joyi, manzili, kontakti va hokazo. GrahQL esa sizga avvaldan malumotning qanday keylarda va qanday data tiplarda kelishini bashoratini berishdan tashqari, faqatgina kerakli malumotni o'zinigina fetch qilish imkonini ham beradi.



post o'ylaganimdan cho'zilib ketdi. Uning qolganini keyingi postda davom ettiraman...

Report Page