Համահեղինակել են Ռոյ Ջիանգը, Ալեքս Քյուսիկը, Թոմաս Հոն, Զաք Ռոբերտսոնը և Ջորդան Ուիլյամսը։

Ներկայացնում ենք radiQL-ը՝ ձեր միակողմանի խանութը, որը կարող է փոխանցվել հին REST-ի հետնամասից դեպի արդյունավետ և ժամանակակից GraphQL API:

REST-ի և GraphQL-ի խափանման համառոտ դասընթաց.

REST-ը, որը այլ կերպ հայտնի է որպես Ներկայացուցչական Պետական ​​Փոխանցում, գերիշխում է որպես վեբ API-ների ստանդարտ՝ իր 2000 թվականից ի վեր: Այսպիսով, ինչն է դրա սխալը:

Տվյալների ավելցուկ և թերբեռնում, ահա թե ինչ: Այս երկու խնդիրները հենց այնպես են հնչում. REST API-ների դեպքում դուք կարող եք շատ տվյալներ ստանալ զանգի ժամանակ, կամ կարող եք շատ քիչ տվյալներ ստանալ զանգի ժամանակ, որոնք երկուսն էլ բացասաբար են ազդում աշխատանքի վրա: Դա պայմանավորված է նրանով, որ երթուղիները նախապես սահմանված են սերվերի կողմից, առանց հաճախորդի ճկունության և ազատության:

Եկեք սա տեսնենք գործողության մեջ: Դիտեք հետևյալ տվյալների բազայի ER դիագրամը, որը կառուցված է սիրելի Star Wars API-ից.

Կան… մի քանիհարաբերություններ տարբեր աղյուսակների միջև: Պատկերացրեք, որ ցանկանում եք ներբեռնել այն հերոսների բոլոր անունները, որոնք հայտնվել են ֆիլմերում, որոնք արել է Լյուկ Սքայուոքերը: Ենթադրելով, որ դուք չունեք նախապես սահմանված նման երթուղի, դուք պետք է հարցում անեք մարդկանց սեղանին _id=1-ով (Լյուկ Սքայուոքեր), ստանաք բոլոր ֆիլմերը, որոնցում նա մասնակցում է և նշեք յուրաքանչյուր ֆիլմ _id, սանրեք բոլորը: այն կերպարները, որոնց _id-ը կապված է այդ ֆիլմերից մեկի _id-ի հետ, և վերջապես՝ վերադարձնել բոլոր այդ կերպարները: Ընդհանուր առմամբ, դա տևում է 63 համաժամեցված ցանցային զանգ և տևում է ավելի քան 3 վայրկյան: 63?? Դա ահավոր բազմաթիվ կոչեր է մի բանի համար, որը կարող է մեզ պարզ թվալ: Եթե ​​միայն մեկ զանգ անելու ինչ-որ միջոց լիներ, որը մեզ կհասցնի բոլոր այն կերպարներին, ովքեր հայտնվել են նույն ֆիլմերում, որոնց նկարահանել է Լյուկը, և միգուցե դա անենք կես վայրկյանում:

Սփոյլեր, կա.

2015 թվականին մուտքագրեք Meta’s GraphQL: GraphQL-ը հարցումների լեզու է, որն ընդունում և լուծում է REST-ի բազմաթիվ թերություններ: Ամենապարզ բառերով, GraphQL-ը սահմանում է ձեր API-ի տվյալների համապարփակ նկարագրությունը և հաճախորդներին հնարավորություն է տալիս խնդրել և ստանալ հենց այն, ինչ ցանկանում են և միայն այն, ինչ իրենք են ցանկանում: Բոլորը մեկ զանգի ընթացքում, մինչ մենք դրանում ենք: Ոչ ավելորդ, ոչ մի թերբեռնում: Այսպիսով, ինչպե՞ս է գործում այս կախարդանքը: Նախ, GraphQL-ի հետ ձեր տվյալները սահմանվում են որպես գծապատկերների կառուցվածք՝ եզրերով միացված հանգույցներով: Այս կառուցվածքը տեսանելի է օգտատիրոջը, ով կարող է հարցում կատարել միայն իրենց ուզած տվյալների համար և ուրիշ ոչինչ և հետ ստանալ միայն այդ տվյալները: Բոլորը եզակի վերջնակետից: Մեր նախորդ «Աստղային պատերազմների» օրինակի համար դա կլինի հետևյալ եզակի հարցումը.

Այս եզակի զանգից մինչև մեկ վերջնակետ (սովորաբար սահմանվում է որպես /graphql) այս մեկ հարցումով, մենք ստանում ենք ճիշտ և միայն այն, ինչ ուզում ենք: Եվ մենք դա շատ ավելի արագ ենք ստանում՝ կես վայրկյան, քանի որ դա միայն մեկ ցանցային զանգ է: Ենթադրվում է, որ GraphQL-ի միջոցով հաճախորդի և սերվերի միջև փոխանակվող JSON փաստաթղթերի չափը կարող է կրճատվել 94%-ով՝ դաշտերի քանակով և 99%-ով՝ բայթերի քանակով: Իհարկե, GraphQL-ի օգտագործումը ձեզ չի բացառում REST-ի օգտագործումը. երկուսն էլ կարող են ներկա լինել նույն սերվերի ֆայլում:

Խնդիրը…

Այժմ դուք հավանաբար հարցնում եք, «եթե GraphQL-ն այդքան հիանալի է, ինչո՞ւ բոլորը չեն օգտագործում այն»: Ֆանտաստիկ հարց. Ամեն ինչ կարգաբերման մեջ է: GraphQL-ը մի բան չէ, որն աշխատում է անմիջապես տուփից: Դուք պետք է սահմանեք «սխեմաներ» և «լուծիչներ»: Սխեմաները սահմանում են ձեր տվյալների ձևը, տիպերի հիերարխիան՝ ձեր հետևի տվյալներից համալրված դաշտերով: Սխեմաները նաև սահմանում են, թե որ հարցումներն ու մուտացիաները հասանելի են հաճախորդի համար (որպեսզի նրանք չկարողանան ջնջել ձեր հետնամասի բոլոր տվյալները վնասակար մուտացիայով կամ զգայուն տեղեկատվության հարցում): Լուծողները գործառույթներ են, որոնք լրացնում են սխեմայի սահմանած դաշտերը անհրաժեշտ տվյալներով: Սա կարճ բացատրությունն է: Այս սխեմայի և լուծիչի սահմանումները կարող են բավականին աշխատունակ լինել: Հատկապես, եթե դուք արդեն աշխատել եք REST-ի հետ, և ձեր բոլոր սերվերներն օգտագործում են REST-ը: Պարզապես Star Wars API-ի տեղափոխումը REST-ից GraphQL-ը հսկայական աշխատանք է՝ իրականում կոդերի մոտ 500+ տող: Եվ մենք չենք սիրում հոգնեցուցիչ բաներ:

… Մեր լուծումը

Ես և իմ գործընկերները OSLabs-ում սիրում ենք GraphQL-ը, և մենք հավատում ենք, որ այն կշարունակի ընդունվել որպես REST այլընտրանք: Դա մի փոքր ցավալի է ստեղծել, սակայն, և մենք այստեղ ենք մտնում:

Մուտքագրեք մեզ՝ radiQL: Տվեք մեզ ձեր PostgreSQL տվյալների բազան, և մենք ձեզ կտանք ձեր սխեմայի և լուծիչի կոդը: Ավելացրե՞լ է բոնուսը: Մենք նաև ստեղծում ենք boilerplate սերվերի կոդը ձեր սխեմայի և լուծիչի միջոցով (GraphQL-Express և ApolloServer), այնպես որ դուք կարող եք նետել այդ կաթսայի սերվերը ձեր սերվերի ֆայլի մեջ և սկսել աշխատել դրա հետ ASAP-ում: Կարող եք նաև ստուգել ձեր PostgreSQL տվյալների բազայի ER դիագրամի վիզուալիզացիան, որը կարող է օգնել ծրագրի հետագա ձևավորմանը, քանի որ այն հստակ ցույց է տալիս ձեր տվյալների միջև փոխհարաբերությունները:

Առանձնահատկությունները. radiQL-ն իր հիմքում գործիք է, որը պարունակում է ալգորիթմ: Մենք նախագծել ենք այս ալգորիթմը PostgreSQL տվյալների բազան կրկնվող անցնելու համար: Հիմնվելով սուբյեկտների հարաբերությունների, դաշտերի և աղյուսակների վրա՝ մեր ալգորիթմը կկառուցի համապատասխան սխեման և լուծիչ տվյալների բազայի համար: Սա նշանակում է, որ մենք հաշվի ենք առնում առաջնային և արտաքին բանալիները, միացման աղյուսակները և արդյունքում առաջացած հարաբերությունները սխեման և լուծիչ կառուցելիս:

Քանի որ սխեման և լուծիչը ենթարկվում են ձեզ, դուք դեռևս պահպանում եք հստակ վերահսկողություն, թե ինչպես են ձեր տվյալները հասանելի դառնում հաճախորդին: Կա՞ն մասեր, որոնք չեք ցանկանում, որ հաճախորդները մուտք ունենան: Սխեմայից և լուծիչից դրանք ջնջելով արագորեն հաջողվում է: Թեև ավելի շատ դաշտեր եք ուզում ավելացնել: Ընդամենը մի քանի տող կոդ, և դուք պատրաստ եք: Թարմացրե՞լ եք ձեր տվյալների բազան և ավելացրել եք ավելի շատ աղյուսակներ կամ հարաբերություններ: Կրկին գործարկեք մեր գործիքը: Հեշտ.

Դեմո՝

Եկեք տեսնենք radiQL-ն գործողության մեջ: Անցեք radiQL գործիքի կայք:

Ձեռք բերեք ձեր PostgreSQL տվյալների բազայի URI-ն (մենք չենք պահում դրա վրա, քանի դեռ չեք ուզում… շարունակեք կարդալ ստորև՝ ավելին իմանալու համար) և գցեք այն մուտքագրման տուփի մեջ և սեղմեք փոխարկել: Նայեք այս շքեղ բեռնման անիմացիաներին, մինչ ձեր սխեման և լուծիչը ստեղծում են:

Բում. Անցեք ներդիրներով՝ պատճենելով ելքը մեր հարմարավետ պատճենահանման կոճակով:

Ցանկության դեպքում, դուք կարող եք ընտրել կաթսայատներից մեկը կաթսայի ափսեի բացվող ցանկից և անցնել կաթսայի ներդիր: Կաթսայի ստեղծման համար կարող է մի փոքր ժամանակ տևել, այնպես որ ամուր պահեք: Երբ դա արվի, դուք կարող եք պատճենել այն նաև մեր փոքրիկ պատճենահանման կոճակով:

Եվ, եթե ցանկանում եք ստուգել ձեր ER դիագրամի վիզուալիզացիան, անցեք դիագրամի ներդիր:

Դուք կարող եք ինչ-որ պահի նկատել, որ փոխակերպման կոճակի տակ կա մոխրագույն կոճակ, որն ասում է «մուտք գործեք տվյալների բազան պահպանելու համար»: Միգուցե մենք պետք է դա անենք: Կտտացրեք մուտքի կոճակը վերևի աջ անկյունում և գրանցվեք, եթե դեռ չեք գրանցվել: Այնուհետև մենք մուտք ենք գործում:

Ինչպես նախկինում, մենք վերցնում ենք մեր PostgreSQL տվյալների բազայի URI-ն և գցում այն ​​մուտքագրման վանդակում: Այստեղ կարող եք սեղմել «պահպանել տվյալների բազան» և անվանել այս պահպանված տվյալների բազան՝ ապագա այցելությունների ժամանակ արագ մուտք գործելու համար:

Այժմ ամեն անգամ, երբ այցելում եք, կարող եք մուտք գործել, բացվող ցանկից ընտրել այս տվյալների բազան և փոխարկել: Այդ տվյալների բազայի ցանկացած թարմացում կարտացոլվի: RadiQL-ի մյուս բոլոր գործառույթները մնում են նույնը:

Նրանց համար, ովքեր կարող են մի փոքր անհանգստանալ անվտանգության համար՝ պահպանելով ձեր տվյալների բազան, մի անհանգստացեք: Այն ապահով կերպով պահված է DynamoDB NoSQL տվյալների բազայում, այլ ոչ թե ինչ-որ պատահական JSON փաստաթուղթ ինչ-որ մեկի նոութբուքում:

Եվ դա ավարտում է մեր ցուցադրությունը:

Վերջնական նշումներ

RadiQL թիմը միշտ բաց է առաջարկների համար, այնպես որ, եթե ունեք այդպիսիք, խնդրում ենք մի հապաղեք կապվել մեզանից որևէ մեկի հետ ստորև: Եթե ​​որևէ վրիպակ կամ խնդիր գտնեք, ազատ զգալ մեզ տեղեկացրեք այստեղ: Մենք շնորհակալություն ենք հայտնում մեր գործիքը ստուգելու համար ժամանակ տրամադրելու համար: Եթե ​​դուք գտաք մեր գործիքը կամ գաղափարները հետաքրքիր և/կամ օգտակար, մենք անկեղծորեն կգնահատենք յուրաքանչյուր GitHub աստղ, որը մենք ստանում ենք:

radiQL թիմը՝

Ալեքս Քյուսիկ | LinkedIn | Գիթհաբ

Թոմաս Հո | LinkedIn | Գիթհաբ

Ռոյ Ցզյան | LinkedIn | Գիթհաբ

Զաք Ռոբերտսոն | LinkedIn | Գիթհաբ

Ջորդան Ուիլյամս | LinkedIn | Գիթհաբ