با این جایگزین REST و نحوه استفاده از آن با Go آشنا شوید.
Graph Query Language (GraphQL) یک زبان و مشخصات برای تعامل با GraphQL APIها، یک معماری سرویس گیرنده-سرور مبتنی بر HTTP برای ارتباط در سراسر وب است.
فیسبوک GraphQL را به عنوان جایگزینی برای استاندارد معماری REST منتشر کرد. GraphQL بیشتر مسائل مربوط به REST را به روشی بدون حالت و کش میپردازد. این یک نحو ساده و بصری را ارائه می دهد که خروجی(های) یا ورودی(های) مورد انتظار را توصیف می کند، و API داده های مطابق با درخواست را رله می کند.
از آنجایی که GraphQL یک مشخصات است، می توانید API های GraphQL را در هر زبان برنامه نویسی سمت سرور، از جمله Go، بسازید و مصرف کنید.
شروع به کار با GraphQL APIs in Go
GraphQL بر اساس معماری HTTP است و Go عملکرد HTTP را در بسته http داخلی خود ارائه می دهد.
میتوانید از بسته http برای استفاده از APIهای RESTful در Go، در کنار سایر ویژگیها استفاده کنید. برای GraphQL، میتوانید با بسته http و سایر بستههای داخلی، درخواستها و جهشهایی را در سرورهای GraphQL API ایجاد کنید.
بسته های مشتری GraphQL مانند Machinebox یا shurCooL روند تعامل با API های GraphQL را آسان تر می کند.
می توانید از بسته http بدون هیچ گونه وابستگی برای تعامل با GraphQL API استفاده کنید. برای شروع این بسته ها را در فایل Go خود وارد کنید:
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
شما از بسته بایت برای ایجاد یک بافر جدید برای درخواست و از بسته json برای ارائه نقشه به بدنه درخواست JSON استفاده خواهید کرد. می توانید از ioutil برای خواندن متن پاسخ و بسته زمانی برای تعیین محدودیت زمانی برای درخواست استفاده کنید.
جستجو در API های GraphQL با Go
بسیاری از API های عمومی رایگان GraphQL وجود دارد که می توانید آنها را پرس و جو کنید و در برنامه های خود ادغام کنید. برای این مقاله، آپولو GraphQL’s Countries API را برای استعلام دادهها در کشورهای سراسر جهان جستجو میکنید.
همه عملیات GraphQL معمولاً درخواستهای POST هستند زیرا باید یک بار (بدنه درخواست) داشته باشند. اکثر API های GraphQL بدنه درخواست JSON را به عنوان نوع محتوا می پذیرند و Go عملکردی را برای استفاده از نقشه ها و ساختارها برای کار با JSON ارائه می دهد.
برای پرس و جو از API، باید ساختار طرحواره GraphQL را مطالعه کنید. پرس و جو مانند یک پرس و جو معمولی GraphQL خواهد بود با این تفاوت که عملیات (پرس و جو یا جهش) کلید است و داده ها مقدار نقشه هستند.
در اینجا نحوه اعلان یک نمونه نقشه JSON که برای درخواست به JSON وارد خواهید شد، آمده است.
jsonMapInstance := map[string]string {
"query": `
{
countries {
name,
phone,
currency,
code,
emoji
}
}
`,
}
متغیر jsonMapInstance نمونه نقشه بدنه درخواست است. مقدار رشته ای از داده های درخواستی است که از API انتظار دارید. در این مورد، دادههای درخواستی که از طرح کشورهای API انتظار دارید، فیلدهای نام، تلفن، ارز، کد و شکلک است.
می توانید از روش Marshal بسته json برای رمزگذاری نمونه نقشه به JSON استفاده کنید. متد مارشال JSON کدگذاری شده و یک خطا را برای مواردی که مشکل رمزگذاری دارند برمی گرداند.
jsonResult, err := json.Marshal(jsonMapInstance)
if err != nil {
fmt.Printf("There was an error marshaling the JSON instance %v", err)
}
هنگامی که نقشه را به JSON کدگذاری کردید، می توانید درخواست POST را به API ارسال کنید. میتوانید یک نمونه درخواست جدید با روش NewRequest ایجاد کنید که نوع درخواست، URL و بافر JSON را میگیرد.
متد NewRequest یک نمونه درخواست را برمی گرداند. شما باید نوع محتوا را بسته به مشخصات API تنظیم کنید. می توانید نوع محتوا را برای درخواست های HTTP با روش Set از روش Header نمونه درخواست خود تنظیم کنید.
newRequest, err := http.NewRequest("POST", "https://countries.trevorblades.com/graphql", bytes.NewBuffer(jsonResult))
newRequest.Header.Set("Content-Type", "application/json")
با متد Client بسته HTTP می توانید یک سرویس گیرنده HTTP ساده برای درخواست خود ایجاد کنید. روش Client همچنین به شما این امکان را می دهد که با بسته زمانی برای درخواست خود محدودیت زمانی تعیین کنید.
client := &http.Client{Timeout: time.Second * 5}
response, err := client.Do(newRequest)
if err != nil {
fmt.Printf("There was an error executing the request%v", err)
}
پس از اینکه کلاینت HTTP را اعلام کردید، درخواست API خود را با متد Do اجرا کنید. متد Do نمونه درخواست را می پذیرد و پاسخ و یک خطا را برمی گرداند.
می توانید پاسخ درخواست API را با روش ReadAll بسته ioutil بخوانید. یک جریان خروجی را می گیرد و یک تکه بایت از داده ها را با یک خطا برمی گرداند که می توانید آن را مدیریت کنید.
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Printf("Data Read Error%v", err)
}
با تابع رشته داخلی، می توانید پاسخ برش بایت را به نوع رشته تبدیل کنید.
fmt.Println(string(responseData))
در اینجا پاسخی است که نتیجه درخواست API را نشان می دهد:
مصرف API های RESTful مانند مصرف API های GraphQL است
از آنجایی که هم REST و هم GraphQL API از پروتکل HTTP استفاده می کنند، مصرف هر یک فرآیند بسیار مشابهی است و می توانید از بسته http برای هر دو مورد استفاده کنید.
شما باید کلاینتها را ایجاد کنید، نمونههایی را درخواست کنید و دادهها را با همان بستهها بخوانید.