Divan - RESTga borishning eng yaxshi usuli (bu GraphQL)

REST vs GraphQL munozarasini bir marta va umuman bekor qilish

Bir zumda REST API-ni yoqing

TL; DR

  • REST va GraphQL o'rtasida tanlov qilmang - avtomatik ravishda GraphQL-dan avtomatik ravishda to'liq RESTful API yarating (kutubxona va bitta qatorli kod bilan)
  • REST-dan foydalanish va ochish paytida GrafQL-ning afzalliklari aks ettirilgan va old tomonida joylashgan
  • GraphQL yordamida orqa ustuningizni yaxshilayotganda, REST bilan barcha mavjud mijozlaringizni qo'llab-quvvatlang
  • Oddiy yo'nalish uchun nom berish va so'rovni ilova qilish orqali mijozlar uchun moslashtirilgan REST oxirgi nuqtalarini yarating.
  • REST vs GraphQL haqida bahslashishni to'xtating. GraphQL-dan foydalaning, REST yarating va ikkalasidan ham eng yaxshisini oling
  • Boshqa tomondan, (GraphQL-ga REST) ​​siz ikkala dunyoning eng yaxshisini olmaysiz, ammo kamroq kuchliroq, GraphQL-ning ba'zi afzalliklari bilan serverni boshqarish qiyin. Bu ko'chib o'tish uchun yaxshi va tez boshlangan narsa ..

Kutib turing, NIMA !?

GraphQL va REST API-larning yaxshi va kamchiliklari va qay birini ishlatishni tanlash to'g'risida ko'p maqolalar yozilgan. Men bu erda bo'lganlarni takrorlamayman.

Aqlli maslahatchilar ushbu maqolalarni yozishga, ushbu maqolalarni o'qishga ko'p vaqt va kuch sarflashadi, aksariyat qismi esa "foydalanish holatingizga bog'liq" xulosasi bilan tugaydi, foydalanish holatlarini ko'rsatmasdan!

Men ko'p yillar davomida REST, GraphQL va SOAP API bilan ishladim. Shunday qilib, nima uchun ishlatilgan holatlar ro'yxati va har birini tekshirish uchun - GraphQL-da REST bilan nima qila olmasligingiz va GraphQL bilan nima qilishni istamasligingiz haqida o'ylamayman deb o'yladim. RESTni afzal ko'rasiz.

Ushbu ro'yxatni yaratgandan so'ng, men birdan fikr oldim - agar boshqa imkoniyat bo'lsa - mening kuchli GraphQL serverim men uchun REST API-ni yaratsa nima bo'ladi?

Shunda men ikki dunyoning eng yaxshisini olishim mumkin edi!

Men g'oya va hayotga qanchalik ko'p kirib borganimda, shunchaki shuni angladimki, nafaqat biz uchun yaratilgan har ikkala turdagi API-larga ega bo'lishimiz mumkin, lekin biz REST API-larini fosh qilmoqchi bo'lsak ham, va bizning mijozlarimizdan hech biri GraphQL, GraphQL-ni ishlatmaydi. REST API yaratishning eng yaxshi usuli!

Qanday qilib yuqoridagi jumlaning ma'nosi ham bor ?!

Odatda, biz (Gildiya) kompaniya va tashkilotlarga o'zlarining API-larini modernizatsiyalashda yordam berganimizda, aniq sabablarga ko'ra GraphQL-ning afzalliklarini birinchi bo'lib tushunadiganlardir. Axborotni ishlab chiqaruvchilar "Uni oling" deganda, ular ushbu texnologiyaning eng katta himoyachilariga aylanadilar. Ammo ular hali ham mavjud mijozlar va uchinchi tomon sheriklarini qo'llab-quvvatlashlari kerak.

Shu sababli, yangi yaratilgan REST API-lari ichki GraphQL-ning afzalliklari va afzalliklariga ega, bu esa ishlab chiqaruvchilarni xursand qiladigan:

  • Har doim yangilanadigan to'liq yaratilgan hujjatlar (Swagger, OpenAPI va GraphiQL)
  • Haqiqatdan ham RESTful API qutisidan tashqarida
  • WebGooks sifatida GraphQL obunalari
  • Amaliy ma'lumotlar tekshiruvi - olingan ma'lumotlar sxema va so'rovlar tuzilishiga mos kelishiga 100% ishonch hosil qiling. Siz men yubormoqchi bo'lgan narsani aniq yuborasiz, satr bu satr, ob'ekt aynan bir xil xususiyatlarga ega.
  • Maxsus so'nggi nuqtani yaratish endi yo'nalish nomini tanlash va unga so'rovni qo'shish masalasidir. bajarildi. Mijozlarga xos bo'lgan so'nggi nuqtalarni yaratish va qo'llab-quvvatlash bo'yicha boshqa qo'lda ishlash kerak emas!
  • GraphQL-ning API-larni sxemalar orqali rivojlanish falsafasidan foydalaning - V1-V2-dan boshqa og'riqli ko'chishlar bo'lmaydi.
  • Odamlarni yollash osonroq bo'lgan zamonaviy texnologiyalardan foydalaning. Facebook, Airbnb va boshqalar kabi kompaniyalar GraphQL-ga o'tdilar. Ularning hech biri orqaga qaytmadi.
  • GraphQL-ning MVC-dan qo'lda yozilgan kontrollerlar o'rniga API-ni amalga oshirishni yaratishga imkon beruvchi rezolyutsiyalar

Ruxsat beruvchilardan nima olaman?

  • Javobga mos keladigan tarzda ma'lumotlarni o'zgartirish osonroq (GraphQL Schema). Buning sababi, har bir ob'ektning o'z echimlari bor, shuning uchun xaritalash kichik qismlarga bo'linadi va butun ilovada qayta ishlatiladi.
  • GraphQL sizga har qanday echuvchi orqali ma'lumotlarni osongina almashish imkonini beradi, biz uni Kontekst deb ataymiz.
  • API-ni yaratishda yordam beradigan ma'lumotni aniqlangan va hal qilishga majbur qiladi. U parallel ravishda funktsiyalarni bajaradi (bir xil darajada joylashtirilgan funktsiyalar), asinx bilan ishlov beradi va oxirida bularning barchasini bitta ob'ektga birlashtirish uchun javob beradi, shuning uchun bu haqda o'ylashingiz shart emas.

Divan - RESTful API yaratish uchun GraphQL-dan foydalaning

Shunday qilib, biz to'liq (qayta tiklanadigan) va sozlanadigan API shlyuzini yaratish uchun GraphQL serveriga o'rnatadigan ochiq manbali kutubxona (Sofa) yaratdik. REST uchun GraphQL-dan foydalaning.

"Qanday qilib" qo'llanmasi

Keling, qanday qilib RESTful API-ni yaratish bo'yicha asta-sekin darslikni yarataylik.

1-qadam: npm-ga "divan-api" paketini o'rnating va quyidagi kod qatorini qo'shing:

2-qadam: RESTda divanga boring, tayyor bo'ldingiz.

Kamil Kisiela Divanni Carlos Rufo tomonidan SpaceX GraphQL API dasturiga bitta majburiyatni qo'shdi.

To'liq yaratilgan REST oxirgi nuqtalarini, Swagger jonli hujjatlarini, GraphiQL muharriri va GraphiQL-Explorer-ni tekshiring!

Aytgancha, bu erda ko'rib turganingiz - bu GraphQL API tepasida yaratilgan, boshqa REST API ustiga yaratilgan REST API….

Nega bunday qildingiz!?!?

Qadimgi REST dasturlaridan asta-sekin ko'chib o'tilmoqda

Bu aslida borish uchun yaxshi yo'nalishdir. Biz ishlaydigan ko'pgina kompaniyalarda ular o'zlarining original veb-xizmatlarining tepasida eski texnologiyalardan foydalangan holda REST API qatlamlarini yaratdilar.

Ammo ushbu REST dasturlari muammoli (odamlar barcha aniq sabablarga ko'ra GraphQL-ga o'tishni tanlaydilar).

Shunday qilib, bizning borishimiz bu REST qatlamlarining yuqori qismida GraphQL dasturlarini yaratish, mijozlarni ushbu dasturlarga o'tkazish va keyinchalik eski RESTful qatlamini asta-sekin olib tashlash va xizmatlarni to'g'ridan-to'g'ri chaqirish.

Divandan foydalanish bu o'tishlarni ancha tezlashtirdi, chunki biz mavjud barcha mijozlarga GraphQL-ni o'zimizdan foydalanmasdan GrafQL-ga o'tishni taklif qilishimiz mumkin. Biz shunchaki bir xil REST tugatish nuqtalarini GraphQL-ning tepasida ochamiz va ular bizning qatlamimizga quvonch bilan o'tmoqdalar, chunki biz ularning barcha talablarini va odatdagi REST oxirgi nuqtalarini original, eski REST dasturlaridan ancha tezroq qondira olamiz.

Menga batafsil ma'lumot bering

Divan sukut bo'yicha Express-ni ishlatadi, ammo siz boshqa har qanday server tizimidan foydalanishingiz mumkin. Divan shuningdek GraphQL serverini agnostik tarzda amalga oshiradi.

Hujjatlar uchun Sofa veb-saytiga va muammolar haqida xabar berish va yordam berish uchun Github omboriga boring.

Divan qanday ishlaydi?

Kaput ostida, Divan so'rovlar va mutatsiyalar turlarining har bir maydonini yo'nalishlarga aylantiradi. Yo'nalishlarning birinchi guruhiga faqat GET usuli orqali kirish mumkin, boshqa tomondan esa mutatsiyalar POSTga aylanadi.

Divan GraphQL-ning AST-dan foydalanib, barcha o'zgaruvchi (hatto chuqur ichiga o'rnatilgan) bilan ishlashni yaratadi va nimani olish kerakligini aniq biladi. Keyinchalik, so'rovning tanasini ishlaydigan parametrlarga o'zgartiradi va uni Sxema bo'yicha bajaradi. Bu mahalliy sharoitda ro'y beradi, lekin tashqi GraphQL Server yoki hatto Apollo Link-dan foydalanish mumkin.

Ayni paytda Divanda Express uchun o'rnatilgan qo'llab-quvvatlov mavjud, ammo boshqa ramkadan foydalanish mutlaqo mumkin. Asosiy tushuncha aynan bir xil bo'lib qoladi, shuning uchun biz so'rovni qanday bajarishimiz har xil server dasturlarida farq qiladi.

WebGooks sifatida GraphQL obunalari?

Uning ishlash usuli shunchaki, siz maxsus marshrutni chaqirib obunani boshlaysiz va keyinroq obunani yangilash yoki hatto to'xtatish uchun ishlatilishi mumkin bo'lgan noyob identifikator olasiz. Obunalar - veb-kukilar. Divanda sizning API-da qandaydir bir hodisa yuz berayotganini aniq biladi va sizga obuna bo'lganingizni bildiradi.

Modellar / manbalar?

Ba'zi hollarda siz butun ob'ektni oshkor qilishni xohlamaysiz, faqat uning identifikatori. Sofa bilan buni qanday bajara olasiz? Ikkita savol bo'lishi kerak. Birinchisi, identifikatorga asoslangan holda bitta ob'ektni qaytarishi kerak (argument bo'lishi mumkin), ikkinchisi esa ularning ro'yxatini hal qilishi kerak. Shuningdek, nomlar bir-biriga mos kelishi kerak, masalan, foydalanuvchi deb nomlangan resursda ikkita so'rov bo'lishi kerak: foydalanuvchi (ID: ID): Foydalanuvchi va foydalanuvchilar: [User]. REST bilan nima qilish kerakligini juda ko'p narsa.

so'rov turi {
  foydalanuvchi (id: ID!): foydalanuvchi
  foydalanuvchilar: [foydalanuvchi]
}

Divan marshrutlarni yaratmasdan oldin u Modellarni qidiradi va ro'yxatga oladi, shuning uchun operatsiyalar qurilganida siz hamma narsani olmaysiz, faqat id.

Ammo siz butun ob'ektni faqat bir necha joylarda olishni istasangiz nima bo'ladi?

Buni amalga oshirishga imkon beradigan "e'tiborsizlik" degan variant mavjud. Siz shunchaki odatiy xatti-harakatni ustidan yozmoqchi bo'lgan yo'ldan o'tasiz.

Quyidagi sxema bo'yicha siz shunchaki muallif identifikatorini olasiz.

turi Kitob {
  Men bajardim
  sarlavha: satr!
  muallif: Foydalanuvchi!
}
kengaytirilgan so'rov {
  kitob (ID: ID!): Kitob
  kitoblar: [Kitob]
}

E'tiborsizlik bilan: ['Book.author'] siz butun ob'ekti bilan yakunlanadi.

divan ({
  ...,
  e'tibor bermaslik: ['Book.author'],
})

Swagger va OpenAPI

GraphQL tipidagi tizim tufayli Sofa sizning REST API uchun har doim eng yangi hujjatlarni yaratishga qodir. Hozirda biz Swagger va uning OpenAPI spetsifikatsiyalarini qo'llab-quvvatlaymiz, ammo turli xil xususiyatlarni qabul qilish juda oson.

Xulosa

divan-api barcha kuchlaridan foydalangan holda GraphQL serveridan RESTful API-ni yaratishni juda osonlashtiradi.

REST vs GraphQL haqida munozara qilib, hayotingizni isrof qilishni to'xtating - Samarali bo'ling, ikkala dunyoning manfaatlariga ega bo'ling va kelajakda API rivojlanishiga o'ting.

Umid qilamanki, bu REST vs GraphQL haqidagi so'nggi maqola…. agar siz buni amalga oshmaydi deb o'ylasangiz, foydalanish holati bilan izohlang va sinab ko'ring!

Men bilan ishlaganligi va ushbu kutubxonani haqiqatga aylantirgani uchun Komil Kisielaga rahmat!

Bizni GitHub va Medium-da kuzatib boring, biz keyingi ikki hafta ichida GraphQL-dan so'nggi yillarda bilib olgan narsalar haqida ko'plab xabarlarni nashr qilishni rejalashtirmoqdamiz.