GraphQL -vaihtoehto REST-palveluille

12.11.20

Rajapinnat

Rajapinnat ovat tärkeä osa nykypäivän web-sovelluksia. Rajapinnan avulla voidaan tehdä pyyntöjä ohjelmistolle, josta halutaan noutaa tietoja. Nykypäivän web-sovelluksissa yleisin tapa toteuttaa rajapintoja on REST-arkkitehtuurimallilla.

REST-arkkitehtuurimallissa palvelun tarjoama data on mallinnettu eri resurssien ympärille. Jokaisella resurssilla on oma yksilöllinen tunniste (URI), jonka kautta dataa voidaan hakea sekä muokata (esim. ”/users” tai ”/posts”). Jos halutaan yhdistää dataa eri resursseista, vaatii se aina erillisiä pyyntöjä useaan eri URI:iin. REST-rajapinnoissa palvelin päättää vastauksen rakenteesta sekä sen sisältämän tiedosta. Tämän seurauksena rajapinta voi palauttaa ylimääräistä dataa, jota käyttäjä ei tarvitse.

RESTin resurssiperusteisuus toimii hyvin useissa tapauksissa, mutta joissain tapauksissa se voi kuitenkin olla hieman kankea vaihtoehto. Oletetaan, että blogilistasovellus näyttää listan, joka sisältää kaikkien seuraamiemme käyttäjien blogeja kommentoineiden käyttäjien lisäämien blogien nimet. Jos palvelin toteuttaisi REST-rajapinnan, käyttäjä joutuisi tekemään monia pyyntöjä ennen kuin saisi muodostettua halutun datan. Pyyntöjen vastauksena tulisi myös paljon ylimääräistä dataa. Jos kyseessä olisi usein käytetty toiminnallisuus, voitaisiin sitä varten toteuttaa oma REST-päätepiste. Jos samanlaisia tilanteita on paljon, tulisi työlääksi toteuttaa kaikille toiminnallisuuksille oma REST-päätepiste.

GraphQL:n avulla toteutettu rajapinta sopii tämänkaltaisiin tilanteisiin hyvin. GraphQL-rajapinnassa kaikki tieto on saatavissa yhden päätepisteen kautta. Käyttäjä määrittää itse mitä kaikkea tietoa päätepisteestä tulee palauttaa. Tällä tavalla voidaan hakea kaiken tarvittavan tiedon yhdellä kyselyllä eikä käyttäjän tarvitse ladata ylimääräistä dataa.

Taustaa

GraphQL sai alkunsa vuonna 2012 Facebookin sisäisesti kehittämänä projektina. Vuonna 2015 se muutettiin avoimen lähdekoodin projektiksi ja kehitysvastuu siirrettiin GraphQL Foundationille. 

Vuonna 2012 Facebookin mobiilisovellukset pitivät sisällään pääosin vain näkymiä heidän mobiililaitteille suunnatulta web-sivustoltaan. Sivuston kasvaessa mobiilisovellukset kuitenkin kävivät hitaiksi ja kaatuilivat usein. Facebookin tavoitteeksi tuli tällöin mobiilisovellusten kirjoittaminen kyseisten alustojen omalla natiivilla ohjelmointikielellä. Tämä kuitenkin vaatii suuren määrän koodin kirjoittamista. Lisäksi palvelimelta vaaditun tiedon eriäväisyydet eri sovellusten välillä sekä monet edestakaiset pyynnöt palvelimelle turhauttivat kehittäjiä. Näistä syistä oli tarve luoda rajapinta, joka pystyisi vastamaan kaikkeen tarvittavaan tietoon ja jota kehittäjät pystyisivät helposti käyttämään.

GraphQL:n peruskäsitteistö

Jokaisen GraphQL-sovelluksen ytimessä on skeema, joka määrittelee minkä muotoista dataa kulkee käyttäjän ja palvelimen välillä. GraphQL:n tarjoamat tyypit, tyyppien sisältämät kentät, tyyppien relaatiot sekä pääoperaatiot tulee määritellä skeemassa. Skeeman määrittelemiseksi GraphQL käyttää omaa kielisyntaksia (GraphQL schema language).

Kuvakaappaus

GraphQL:ssä on kolme pääoperaatiotyyppiä:

Yksi keskeisimmistä tyypeistä on objektityyppi. Objektityyppiä käytetään kuvaamaan oliota ja sen tietoja, jota GraphQL-rajapinnasta pystytään hakemaan (kuvassa ” Post” ja ”Person”)

GraphQL-palvelimen tulee määritellä resolverit jokaiselle skeemassa määritellyn tyypin kentälle. Resolverit ovat vastuussa pyydetyn datan palauttamisesta

Lopuksi

GraphQL on suhteellisen uusi tulokas avoimen lähdekoodin rajapinnoissa, mutta on jo alkanut vaikuttaa siihen, miten yritykset lähestyvät käyttäjäohjelmien ja rajapintojen luomista. GraphQL:in avulla front end-kehittäjät voivat vapaasti hakea tarvitsemansa dataa ja back end-kehittäjät voivat erottaa käyttäjäohjelman tarpeet back end-arkkitehtuurista. Tällä hetkellä sadat organisaatiot, kuten Facebook, GitHub, PayPal ja the New York Times, hyödyntävät GraphQL:ia teknisissä ratkaisuissa.