Graph Query Language (GraphQL) är ett språk och en specifikation för interaktion med GraphQL API: er, en HTTP-baserad klient-server-arkitektur för kommunikation över webben.
Facebook släppte GraphQL som ett alternativ till REST-arkitektonisk standard. GraphQL löser de flesta problem med REST på ett tillståndslöst och cachebart sätt. Den tillhandahåller en enkel och intuitiv syntax som beskriver förväntade utdata eller indata, och API: n vidarebefordrar data som matchar begäran.
Eftersom GraphQL är en specifikation kan du bygga och använda GraphQL API: er i vilket programmeringsspråk som helst på serversidan, inklusive Go.
Komma igång med GraphQL APIs i Go
GraphQL är baserat på HTTP-arkitektur, och Go tillhandahåller HTTP-funktionalitet i sin inbyggda http paket.
Du kan använda http paketera till konsumera RESTful APIs i Go, bland andra funktioner. För GraphQL kan du göra frågor och mutationer till GraphQL APIs servrar med http paket och andra inbyggda paket.
GraphQL-klientpaket som Maskinlåda eller shurCooL's gör processen att interagera med GraphQL API: er ännu enklare.
Du kan använda http paket utan några beroenden för att interagera med ett GraphQL API. Importera dessa paket till din Go-fil för att börja:
importera (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"tid"
)
Du kommer att använda bytes paket för att skapa en ny buffert för begäran och json paket för att samla en karta till JSON-begäran. Du kan använda ioutil att läsa svarstexten och tid paket för att ställa in en tidsgräns för begäran.
Fråga efter GraphQL API: er med Go
Det finns många gratis offentliga GraphQL API: er som du kan fråga efter och integrera i dina applikationer. För den här artikeln kommer du att fråga Apollo GraphQL: s Countries API för att fråga data om länder över hela världen.
Alla GraphQL-operationer är vanligtvis POST-förfrågningar eftersom de måste ha en nyttolast (begäran). De flesta GraphQL API: er accepterar JSON-begäran som innehållstyp, och Go tillhandahåller funktionalitet för att använda kartor och strukturer för att arbeta med JSON.
Du måste studera strukturen för GraphQL-schemat för att fråga API: t. Frågan kommer att vara densamma som en vanlig GraphQL-fråga förutom att operationen (fråga eller mutation) är nyckeln, och data är kartans värde.
Så här kan du deklarera en JSON-kartinstans som du kommer att samla in i JSON för begäran.
jsonMapInstance := Karta[sträng]sträng {
"fråga": `
{
länder {
namn,
telefon,
valuta,
koda,
emoji
}
}
`,
}
De jsonMapInstance variabel är kartinstansen för begärans kropp. Värdet är en sträng av frågedata som du förväntar dig från API: et. I det här fallet, frågedatan du förväntar dig från API: erna länder schemat är namn, telefon, valuta, koda, och emoji fält.
Du kan använda Marskalk metod för json paket för att koda kartinstansen till JSON. De Marskalk metod returnerar den kodade JSON och ett fel för fall med ett kodningsproblem.
jsonResult, err := json. Marshal (jsonMapInstance)
om fel!= noll {
fmt. Printf("Det uppstod ett fel vid marshaling av JSON-instansen %v", err)
}
När du har kodat kartan till JSON kan du skicka POST-begäran till API: et. Du kan skapa en ny begäran instans med Ny förfrågan metod, som tar in förfrågningstyp, URL och JSON-buffert.
De Ny förfrågan metod returnerar en begäran instans. Du måste ställa in innehållstypen beroende på API: ets specifikationer. Du kan ställa in innehållstypen för HTTP-förfrågningar med Uppsättning metod för Rubrik metod för din begäran instans.
newRequest, err := http. NewRequest("POST", "https://countries.trevorblades.com/graphql", bytes. NewBuffer (jsonResult))
ny förfrågan. Rubrik. Set("Content-Type", "application/json")
Du kan skapa en enkel HTTP-klient för din begäran med Klient metod för HTTP-paketet. De Klient metoden låter dig också ställa in en tidsgräns för din förfrågan med tid paket.
klient := &http. Klient{Timeout: tid. andra * 5}
svar, fel := klient. Gör (newRequest)
om fel!= noll {
fmt. Printf("Det uppstod ett fel vid exekvering av begäran%v", err)
}
När du har deklarerat HTTP-klienten, kör din API-begäran med Do metod. De Do metod accepterar begäran instansen och returnerar svaret och ett fel.
Du kan läsa svaret på API-förfrågan med ioutil paketets Läs allt metod. Den tar in en utgångsström och returnerar en bit byte av data med ett fel som du kan hantera.
responseData, err := ioutil. Läs allt (svar. Kropp)
om fel!= noll {
fmt. Printf("Data Read Error%v", err)
}
Med den inbyggda strängfunktionen kan du konvertera bytesegmentsvaret till strängtypen.
fmt. Println(sträng(responseData))
Här är ett svar som visar resultatet av API-begäran:
Att konsumera RESTful API: er är som att konsumera GraphQL API: er
Eftersom både REST- och GraphQL-API: er använder HTTP-protokollet är att konsumera var och en en mycket liknande process, och du kan använda http paket för båda fallen.
Du måste skapa klienter, begära instanser och läsa data med samma paket.