Membangun API Modern Menggunakan GraphQL

Petra Barus
Dec 22, 2019 · 4 min read

Dalam membangun aplikasi yang terdistribusi, baik itu berbentuk aplikasi mobile ataupun aplikasi client-server, kita hampir selalu menggunakan protokol komunikasi yang disebut Application Programming Interface atau API yang dipanggil melalui jaringan. Dewasa ini format API yang populer digunakan oleh REST API di mana kita dapat memanggil resource menggunakan protokol HTTP.

Selain dari REST API, sekarang terdapat metode pemanggilan data baru yang mulai populer digunakan, yakni GraphQL. Metode ini diciptakan oleh Facebook tahun20untuk mengatasi keterbatasan REST API dalam kasus penggunaan internal Facebook. Berangkat dari niat untuk mempromosikan adopsi dan pengembangan potensi GraphQL secara netral, Facebook bersama dengan perusahaan-perusahaan lain termasuk AWS membangun organisasi GraphQL Foundation di bawah Linux Foundation.

Seperti Apa GraphQL?

GraphQL memiliki tiga jenis operasi: query untuk membaca data, mutation untuk mengubah data, dan subscription untuk mengamati event. Operasi query dan mutation memiliki model request-response di mana client mengirim request dan server mengembalikan response.

Berbeda dengan yang lain, operasi subscription memiliki metode streaming. Client mengirim request untuk melakukan langganan ke aliran data. Kemudian server akan membuka koneksi yang berkelanjutan dan akan mengirimkan data terus menerus sesuai dengan permintaan. Operasi ini cocok untuk aplikasi real-time seperti chat room, aplikasi navigasi, atau monitor sensor.

Contoh sebuah operasi adalah seperti di bawah.

query GetBooksForAuthor($id: ID!) {
author (id: $id) {
givenName,
nationality,
books {
title,
isbn
}
}
}

Kata kunci pertama query pada baris 1 adalah tipe operasi seperti yang telah dijelaskan di atas. Kata kunci ini akan diikuti oleh pengenal yang opsional, dalam hal ini GetBooksForAuthor. Pengenal ini berguna dalam melakukan debugging di server jika operasi ini dicatat ke dalam log. Selanjutnya $id: ID! adalah variabel masukan, agar operasi bisa digunakan berulang kali.

Baris 2 hingga 9 adalah apa yang disebut selection set yang merepresentasikan struktur data yang dikembalikan, dalam contoh di atas adalah struktur penulis dengan data nama, kenegaraan, dan buku-buku. Atribut books adalah sub selection set yang merepresentasikan struktur buku.

GraphQL Dibandingkan REST API

Di bagian ini kita akan melihat seperti apa GraphQL dibandingkan REST API, tanpa bertujuan untuk menunjukkan GraphQL jauh lebih unggul daripada REST API. GraphQL dan REST API mempunyai kelebihan dan kekurangan masing-masing pada penggunaan yang berbeda-beda.

Perbedaan pertama adalah REST API tidak memiliki definisi yang lugas di antara pengembang satu dan yang lainnya. Kita bisa tidak setuju dengan banyak pengembang tentang bagaimana harusnya membuat spesifikasi dan implementasi REST API. Ini akan menyulitkan jika kita menggunakan REST API dari penyedia layanan yang berbeda-beda. Sementara GraphQL memiliki definisi yang jelas yang dapat diakses semua orang.

Kemudian perbedaan kedua terletak pada pemodelan. Model pada REST API adalah resource. Setiap resource didefinisikan oleh URI (Unified Resource Identifier). Untuk mengakses tiap resource kita menggunakan URI yang berbeda-beda seakan-akan mengakses berkas yang berbeda di internet. Sementara itu model pada GraphQL, sesuai namanya, adalah graf. Model direpresentasikan oleh sebuah node dan relasi antal model oleh edge.

Dalam hal pengorganisasian, pada REST API sebuah resources dapat terhubung dengan resource lain di domain lain. Sementara itu GraphQL tersentralisasi dengan adanya satu skema yang menjadi otoritas untuk satu domain.

GraphQL memiliki apa yang disebut introspection query yang akan mengunduh dokumentasi dari skema. Dengan query ini kita akan selalu memiliki skema yang up to date. Sementara itu di REST API tidak ada standar baku untuk mendefinisikan skema. Pengembang dapat menggunakan standar yang berbeda-beda seperti SOAP atau SWAGGER.

GraphQL juga memiliki fitur data typing yang membantu pengembang mengetahui tipe data apa yang harus dikirim dan yang akan dikembalikan dari server. Dalam REST API, semua resource dikirim dalam bentuk data yang terbatas sehingga kita seringkali harus melakukan data casting.

Bagaimana GraphQL Membantu Menghadapi Tantangan Desain API Modern

Dalam membangun API modern, kita seringkali menghadapi tantangan seperti efficiency, predictability, dan versioning. Bagaimana GraphQL membantu kita untuk menghadapi tantangan-tantangan ini?

Tantangan efisiensi memiliki kaitan dengan masalah overfetching dan underfetching. Operasi yang overfetching akan mengembalikan data di luar yang kita butuhkan. Misalnya, ketika kita membutuhkan data nama pengguna dan meminta data dari sebuah REST API endpoint, server dapat mengembalikan data yang tidak kita butuhkan seperti umur, tanggal lahir, nomor telepon dan alamat. Sementara itu operasi yang underfetching akan membutuhkan kita untuk mengambil data berulang kali. Misalnya ketika kita ingin mengambil data penulis beserta buku yang dia tulis. Kita harus memanggil beberapa kali API untuk hal ini. Di GraphQL kita dapat mendeklarasikan hanya data-data yang kita butuhkan sehingga kita menghindara overfetching dan underfetching. Hal-hal seperti ini penting untuk diperhatikan jika kita ingin membuat aplikasi yang berjalan di koneksi internet yang tidak terlalu bagus.

Keuntungan selanjutnya adalah type-safety pada GraphQL akan mendukung predictability data yang dikembalikan. Kita tidak perlu menebak-nebak dan menyesuaikan tipe data yang akan kita gunakan, terutama jika kita menggunakan bahasa pemrograman yang static typed seperti Java untuk Android, Objective-C atau Swift untuk iOS, atau pun C# .NET. Kita bisa mengenerate kode dengan mudah dan IDE akan membantu kita untuk menghemat waktu dan menghindari bug yang terjadi terkait dengan kesalahan tipe data atau kurangnya atribut atau nilai yang diassign pada obyek.

Di dalam REST API, kita biasanya melakukan versioning dengan mengubah route. Misalnya kita mengubah https://api.example.com/v1/ menjadi https://api.example.com/v2/. Meskipun dalam GraphQL kita juga bisa menggunakan versioning yang sama dengan REST API, dalam GraphQL kita dapat menghindari versioning. Karena GraphQL mengirimkan data secara eksplisit yang kita minta, kita bisa menambahkan field atau tipe data baru tanpa harus merusak kontrak yang lama.


Ini adalah salah satu tulisan dari seri re:Invent 2019 yang saya liput. Dalam tulisan ini saya meliput sesi berjudul “Building Modern APIs using GraphQL” yang dibawakan oleh Robert Zhu, Principal Tech Evangelist di AWS. Tulisan-tulisan lain yang terkait bisa dilihat di link ini. Youtube video dari sesi ini bisa diakses di link ini (atau putar di bawah). Referensi tentang GraphQL bisa diakses di link ini.

Di tulisan-tulisan selanjutnya saya akan menuliskan tutorial bagaimana menggunakan GraphQL di aplikasi Anda untuk mengakses resource di AWS. Jika ada ide topik atau permintaan topik lain seputar AWS, silakan tulis di bagian komentar!

Tulisan ini pertama kali dipublikasikan di Membangun API Modern Menggunakan GraphQL — Blog Petra Barus.

Petra Barus

Written by

Senior Developer Advocate at Amazon Web Services. I cover for Indonesia.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade