**GraphQL** er et språk tilgjengelig som åpen kildekode som er brukt til spørring og manipulering av programmeringsgrensesnitt, samt en kjøreomgivelse for å utføre spørringer mot eksisterende data.

Historie
--------

I 2012 ble GraphQL utviklet internt av Facebook, og i 2015 ble det gitt ut offentlig. I 2018 ble GraphQL-prosjektet overført fra Facebook til den nyetablerte GraphQL Foundation i regi av den ideelle organisasjonen Linux Foundation.

Siden 2012 har bruken av GraphQL økt tilnærmet likt adopsjonstidslinjen som ble angitt av Lee Byron, en av skaperne bak GraphQL. Byrons mål var å gjøre GraphQL allestedsnærværende på tvers av webplattformer.

Den 9. februar 2018 ble GraphQL Schema Definition Language (SDL) en del av spesifikasjonen.

Spesifikasjon av datastrukturer
-------------------------------

GraphQL angir en tilnærming til å utvikle web-API-er, og har blitt sammenlignet med og opp mot REST og andre webtjeneste-arkitekturer. Den tillater klienter å definere strukturen til dataene som kreves, og den samme datastrukturen returneres fra serveren, hvilket forhindrer at store datamengder returneres. Dette har betydning for hvor effektivt man kan få resultater fra spørringer mot webhurtiglagre.

Eksempel
--------

POST-forespørsel:

```
{
    orders {
        id
        productsList {
            product {
                name
                price
            }
            quantity
        }
        totalAmount
    }
}

```
Svar:

```
{
 "data": {
 "orders": [
 {
 "id": 1,
 "productsList": [
 {
 "product": {
 "name": "orange",
 "price": 1.5
 },
 "quantity": 100
 }
 ],
 "totalAmount": 150
 }
 ]
 }
}

```

Oppbygning
----------

GraphQL består av et typesystem, spørrespråk og utførelsessemantikk, statisk validering og typeintrospeksjon. Den støtter lesing, skriving (mutering) og abonnering på endringer i data (sanntidsoppdateringer), oftest implementert ved hjelp av WebSockets. GraphQL-tjenere er tilgjengelige for flere språk inkludert Haskell, JavaScript, Perl, Python, Ruby, Java, C++, C#, Scala, Go, Rust, Elixir, Erlang, PHP, R, D og Clojure.

Alternativer
------------

Fleksibiliteten og rikdommen i spørringsspråket legger også opp til en kompleksitet som kanskje ikke er verdt å ha for enkle API-er. Til tross for navnet har ikke GraphQL mulighet for samme mengde av grafoperasjoner som en fullverdig grafdatabase, som for eksempel Neo4j eller enkelte dialekter av SQL som støtter transitiv lukking. Eksempelvis vil man med et GraphQL-grensesnitt som rapporterer foreldrene til et individ ikke kunne returnere mengden med alle disse sine forfedre i en enkelt spørring.

Se også
-------

* OpenAPI Specification

Referanser
----------

1. ↑  «GraphQL: A query language for APIs.».
2. ↑  «GraphQL: A data query language».
3. ↑  «Facebook's GraphQL gets its own open-source foundation». *TechCrunch* **(engelsk)**. Besøkt 7. november 2018.
4. ↑  «The Linux Foundation Announces Intent to Form New Foundation to Support GraphQL - The Linux Foundation». *The Linux Foundation* **(engelsk)**. 6. november 2018. Arkivert fra originalen 28. januar 2019. Besøkt 7. november 2018.
5. ↑  Anthony, Art. «Is GraphQL Moving Toward Ubiquity?».
6. ↑  «GraphQL SDL included in Github repository».
7. ↑  «GraphQL». Facebook. Arkivert fra originalen 18. juli 2018. Besøkt 4. juli 2018.
8. ↑  «GraphQL js».
9. ↑  «GraphQL - Perl implementation of GraphQL».
10. ↑  «Graphene». Besøkt 18. juni 2017.
11. ↑   *graphql/libgraphqlparser*, GraphQL, besøkt 2020-05-30
12. ↑  «Absinthe: The GraphQL toolkit for Elixir». Besøkt 19. juli 2018.
13. ↑  «Package graphqld on DUB».
14. ↑  «GraphQL vs REST: Overview». *Phil Sturgeon* **(engelsk)**. Besøkt 25. november 2018.
15. ↑  «Why use GraphQL, good and bad reasons». *Honest Engineering* **(engelsk)**. 4. august 2018. Arkivert fra originalen 26. november 2018. Besøkt 26. november 2018.
16. ↑  «GraphQL Fundamentals». Besøkt 4. juli 2018.