Помните ли добрия стар протокол SOAP? Може би сте го забравили, защото REST го замени и е много по-добър!
Но какво ще стане, ако ви кажа, че скоро ще пожелаем да забравим REST в полза на GraphQL?

Необходимостта от търсене на данни

GraphQL е език за заявки, създаден от Facebook през 2012 г. и с отворен код през 2015 г.
Той позволява заявки и манипулации за конкретни данни, така че клиентите да имат повече контрол върху информацията, която сървърът ще изпрати.< br /> Често срещан проблем с REST е свръхизвличането на данни: представете си, че искате да знаете само първото име и имейла на даден потребител, но API ще върне целия профил... защо получаваме толкова много безполезна информация?
Сега си представете, че се нуждаете само от списък с потребителски идентификатори, но API ще върне огромен масив от обекти, съдържащи информация за всеки потребител. Каква загуба на време и ресурси!
GraphQL предоставя API за извличане на декларативни данни, който ви позволява да изисквате само това, от което се нуждаете.

Тип безопасност

GraphQL заявките са написани на Schema Definition Language (SDL), който изисква силно въвеждане. Схемите на GraphQL се валидират по време на компилиране, което означава, че компилацията ще бъде неуспешна, ако във вашата схема бъде открита грешка в типа.

Отказ от употреба и версии

Идвайки от REST, може би си спомняте, че след известно време някои API могат да бъдат остарели.
Може да се наложи да превключите от https://someapi.dev/v1/myendpoint на https://someapi.dev/v2/myNewEndpoint, тъй като структурата на нашите ресурси се промени с времето.
GraphQL избягва това, защото клиентът прави заявки към API, точно както би направил в база данни.
Структурата може да се промени на сървъра, но клиентът все още ще може да получи съдържанието й в желан формат.

Създаване на сървъра

Така че нека изградим GraphQL сървър! Първо създайте нов проект и инсталирайте следните пакети:

Страхотен. Сега нека създадем ./src/main.js файл и нов Express Server:

Нека опитаме да стартираме нашия уеб сървър и да видим дали работи: node ./src/main.js:

Не е най-добре изглеждащата уеб страница, но работи! Сега може да искаме да добавим крайна точка на GraphQL, може би с помощта на страхотния инструмент GraphiQL.

Нека анализираме какво направихме:

  • Импортирахме междинния софтуер Express GraphQL (express-graphql).
  • Импортирахме функция buildSchema, която ни позволява да изградим GraphQL схема, която описва нашите изходни данни.
  • На ред 7 изграждаме нашата схема с помощта на Schema Definition Language (SDL). Ще трябва да дефинираме тип за всяка стойност (в този случай имаме само message, което е String).
  • На ред 13 дефинираме Resolver: той съдържа картографирането на действия към функции. Когато се нуждаете от данните message, нашият резолвер просто ще изпрати обратно низа hello world. Доста лесно, нали?
  • На ред 19 най-накрая създаваме крайната точка /graphql, която също използва express-graphql междинен софтуер за създаване на интерфейс GraphiQL.

Нека стартираме отново нашия сървър и отидем на http://localhost:3000/graphql:

Страхотно! Само с няколко реда код създадохме крайна точка на GraphQL! Нека го тестваме, като изисква нашия message:

И ето ви! Току-що направихме нашия първи GraphQL сървър!
Сега нека направим нещо по-сложно. Нека създадем нов файл ./src/data.js:

Добре, сега имаме нашия малък набор от данни! Ще разкрием крайна точка на GraphQL, която ще ни позволи да правим запитвания към списък от езици за програмиране.

За да направим кода по-поддържаем, нека създадем трети файл: ./src/graphqlData.js

Първо: нека импортираме както нашите data, така и buildSchema.
Трябва да дефинираме схема за нашата крайна точка на GraphQL. Както можете да видите, първо дефинираме типа Query, което ни позволява да:

  1. Вземете конкретен език, даден ID (който е Integer). Ще върне Language, което е тип, който ще създадем в редовете по-долу.
  2. Вземете списък (масив в JavaScript) от езици, дадени на конкретна парадигма. Отново парадигмата трябва да е от тип String и ще върне списък (отново масив в JavaScript) от Language.

Не на последно място, дефинираме типа Language. Идвайки от други езици за програмиране, усещането е като записване на структура или запис.
Когато дефинираме нов тип GraphQL, трябва да напишем описание на данните, които ще бъдат поискани. В нашия случай имаме id, което е Int, name, което е String и така нататък.

Нека да продължим и да създадем две функции, които ще ни позволят да получаваме нашите данни:

Току-що създадохме две функции и постоянна стойност, нека видим как работят:

  • getLanguage приема Object като аргумент и ще филтрира нашите данни, връщайки ни само езика с даден ID.
  • getLanguages приема Object като аргумент и ще върне масив от езици, дадени на конкретна парадигма.
  • rootValue просто съставя нашата rootValue, която да се използва в express-graphql.

Моля, обърнете внимание, че и getLanguage, и getLanguages връщат един и същ тип, който дефинирахме в нашата схема.

Сега съберете всичко заедно:

Страхотно! Нека модифицираме малко нашия ./src/main.js файл:

И сега е време да го тествате! Нека рестартираме нашия уеб сървър и да тестваме нашата крайна точка на GraphQL:

Страхотно! И какво, ако искаме да премахнем някои стойности от нашата заявка?

Много лесно!
Ами ако искаме да получим определен език?

Успяхме! Създадохме проста крайна точка на GraphQL само с няколко реда код.
Най-хубавото е, че нашите данни могат да идват от база данни, файл, където пожелаем!
Това е просто изпълнение... но си представете колко далеч можем да стигнем от тук!

Можете да видите пълния код тук: