GraphQL API
Кардар так өзүнө керектүү маалыматты сураган бир типтештирилген кириш чекити
/graphql кириш чекитин ачасыз. Кардар так керектүү талаалардын топтомун сүрөттөгөн суроо жөнөтөт, ал эми сервер так ошол форманы кайтарат — кем эмес, көп эмес. Сиз мурда Express менен REST API курдуңуз; GraphQL — бул сиз мурдатан билген ошол эле маалымат булактарынын (SQL, MongoDB, башка сервистер) үстүнө коюлган башка келишим.
- объекттик типтер,
QueryжанаMutationменен GraphQL-схемасын SDL'де жазуу; - резолверлерди ишке ашыруу жана алардын
(parent, args, context, info)сигнатурасын окуу; - суроолорду (окуу) мутациялардан (жазуу) айырмалоо жана ар бир операцияны түзүү;
- N+1 маселесин таануу жана DataLoader аны батчинг менен кантип жоготорун түшүндүрүү;
- GraphQL менен REST'тин чынчыл алмашууларын салмактап, аңдап тандоо.
1. GraphQL эмне үчүн керек: ашыкча жана жетишсиз тандоо
REST API'де ар бир эндпоинт белгиленген жоопту кайтарат. Колдонуучунун атын жана анын акыркы үч постунун аталыштарын талап кылган мобилдик экранды элестетиңиз. REST менен сиз көбүнчө эки начар вариант алдында каласыз:
- Ашыкча тандоо (over-fetching).
GET /users/42бүт колдонуучу объектин кайтарат — email, дарек, ырастоолор, убакыт белгилери — сизге болгону ат керек болгондо. Ар бир сурооодо байттар текке кетет. - Жетишсиз тандоо (under-fetching, ашык кайрылуулар). Бул эндпоинт посттарды камтыбайт, ошондуктан кардар экинчи
GET /users/42/postsсурооосун жасайт. Бир экран үчүн эки тармактык кайрылуу; экран көбөйгөн сайын тармакта ызы-чуу көбөйөт.
GraphQL кардар үчүн эки маселени тең жоёт. Кардар так өзүнө керектүү маалымат дарагын сүрөттөгөн бир суроо жөнөтөт:
query {
user(id: 42) {
name
posts(last: 3) { title }
}
}
Сервер так ушул форманы кайталаган JSON-объект менен жооп берет: name талаасы бар user жана ар биринде title бар posts массиви — башка эч нерсе жок.
Салыштыруу. REST — бул белгиленген менюсу бар ресторан: ар бир тамак (эндпоинт) алдын ала даярдалып берилет, ал эми гарнир керек болсо — экинчи тамак заказ кыласыз. GraphQL — бул өзүңүз тандаган боул: сиз бир заказ бланкында так керектүү ингредиенттерди белгилейсиз, ашкана болсо бир боул чогултат. Ашкана (сиздин маалымат булактарыңыз) өзгөрбөйт; болгону заказ келишими өзгөрөт.
Маанилүү: GraphQL сиздин маалымат базаңызды же бизнес-логикаңызды алмаштырбайт. Ар бир талаанын астында Postgres, MongoDB, кэш же башка HTTP-сервистен окуган кадимки код бар — мурдагы курстардан ушул эле көндүмдөр.