GraphQL - Panduan Cepat
GraphQL adalah teknologi sisi server open source yang dikembangkan oleh Facebook untuk mengoptimalkan panggilan API RESTful. Ini adalah mesin eksekusi dan bahasa kueri data. Pada bab ini, kita membahas tentang keuntungan menggunakan GraphQL.
Mengapa GraphQL
RESTful API mengikuti pendekatan berorientasi sumber daya yang jelas dan terstruktur dengan baik. Namun, ketika data menjadi lebih kompleks, rute menjadi lebih panjang. Terkadang tidak mungkin mengambil data dengan satu permintaan. Di sinilah GraphQL berguna. GraphQL menyusun data dalam bentuk grafik dengan sintaks kueri yang kuat untuk melintasi, mengambil, dan memodifikasi data.
Berikut ini adalah keuntungan menggunakan bahasa kueri GraphQL -
Mintalah apa yang Anda inginkan - dan dapatkan
Kirim kueri GraphQL ke API Anda dan dapatkan apa yang Anda butuhkan. Kueri GraphQL selalu memberikan hasil yang dapat diprediksi. Aplikasi yang menggunakan GraphQL cepat dan stabil. Tidak seperti layanan Restful, aplikasi ini dapat membatasi data yang harus diambil dari server.
Contoh berikut akan membantu Anda memahami ini dengan lebih baik -
Mari kita pertimbangkan objek bisnis Student dengan atribut id, firstName, lastName dan collegeName . Misalkan aplikasi seluler hanya perlu mengambil firstName dan id . Jika kita mendesain titik akhir REST seperti / api / v1 / students , itu akan mengambil data untuk semua bidang untuk objek siswa . Ini berarti, data diambil berlebihan oleh layanan RESTful. Masalah ini dapat diatasi dengan menggunakan GraphQL.
Pertimbangkan kueri GraphQL yang diberikan di bawah ini -
{
students {
id
firstName
}
}
Ini akan mengembalikan nilai hanya untuk bidang id dan nama depan. Kueri tidak akan mengambil nilai untuk atribut lain dari objek siswa. Respon dari query yang diilustrasikan di atas adalah seperti yang ditunjukkan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim"
},
{
"id": "S1002",
"firstName": "Kannan"
}
]
}
}
Dapatkan banyak sumber daya dalam satu permintaan
Kueri GraphQL membantu mengambil objek bisnis terkait dengan lancar, sementara REST API biasa memerlukan pemuatan dari beberapa URL. API GraphQL mengambil semua data yang dibutuhkan aplikasi Anda dalam satu permintaan. Aplikasi yang menggunakan GraphQL bisa cepat bahkan pada koneksi jaringan seluler yang lambat.
Mari kita perhatikan satu obyek bisnis lagi, Perguruan Tinggi yang memiliki atribut: nama dan lokasi. The Student objek bisnis memiliki hubungan asosiasi dengan objek College. Jika kami menggunakan REST API untuk mengambil detail siswa dan perguruan tinggi mereka, kami akan membuat dua permintaan ke server seperti / api / v1 / students dan / api / v1 / college . Ini akan menyebabkan pengambilan data yang kurang dengan setiap permintaan. Jadi aplikasi seluler terpaksa melakukan beberapa panggilan ke server untuk mendapatkan data yang diinginkan.
Namun, aplikasi seluler dapat mengambil detail untuk objek Student dan College dalam satu permintaan dengan menggunakan GraphQL.
Berikut ini adalah query GraphQL untuk mengambil data -
{
students{
id
firstName
lastName
college{
name
location
}
}
}
Output dari kueri di atas berisi persis bidang yang kami minta seperti yang ditunjukkan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim",
"lastName": "Mohammad",
"college": {
"name": "CUSAT",
"location": "Kerala"
}
},
{
"id": "S1002",
"firstName": "Kannan",
"lastName": "Sudhakaran",
"college": {
"name": "AMU",
"location": "Uttar Pradesh"
}
},
{
"id": "S1003",
"firstName": "Kiran",
"lastName": "Panigrahi",
"college": {
"name": "AMU",
"location": "Uttar Pradesh"
}
}
]
}
}
Jelaskan apa yang mungkin dengan sistem tipe
GraphQL sangat diketik dan kueri didasarkan pada bidang dan tipe data yang terkait. Jika ada jenis ketidakcocokan dalam kueri GraphQL, aplikasi server mengembalikan pesan kesalahan yang jelas dan membantu. Ini membantu dalam debugging yang lancar dan deteksi bug yang mudah oleh aplikasi klien. GraphQL juga menyediakan pustaka sisi klien yang dapat membantu mengurangi konversi dan penguraian data eksplisit.
Contoh tipe data Mahasiswa dan Perguruan Tinggi diberikan di bawah ini -
type Query {
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
fullName:String
college:College
}
type College {
id:ID!
name:String
location:String
rating:Float
students:[Student]
}
Bergerak lebih cepat dengan alat pengembang yang canggih
GraphQL menyediakan alat pengembang yang kaya untuk dokumentasi dan pengujian kueri. GraphiQL adalah alat luar biasa yang menghasilkan dokumentasi kueri dan skemanya. Ini juga memberikan editor kueri untuk menguji API GraphQL dan kemampuan penyelesaian kode cerdas sambil membuat kueri.
Pada bab ini, kita akan belajar tentang pengaturan lingkungan untuk GraphQL. Untuk menjalankan contoh dalam tutorial ini, Anda memerlukan yang berikut -
Komputer yang menjalankan Linux, macOS, atau Windows.
Peramban web, sebaiknya versi Google Chrome terbaru.
Versi terbaru Node.js telah diinstal. Versi LTS terbaru direkomendasikan.
Visual Studio Code dengan ekstensi GraphQL untuk VSCode diinstal atau editor kode pilihan Anda.
Cara Membangun server GraphQL dengan Nodejs
Kami akan melalui pendekatan langkah-bijaksana terperinci untuk membangun server GraphQL dengan Nodejs seperti yang ditunjukkan di bawah ini -
Langkah 1 - Verifikasi Versi Node dan Npm
Setelah menginstal NodeJs, verifikasi versi node dan npm menggunakan perintah berikut di terminal -
C:\Users\Admin>node -v
v8.11.3
C:\Users\Admin>npm -v
5.6.0
Langkah 2 - Buat Folder Proyek dan Buka di VSCode
Folder akar proyek dapat diberi nama sebagai aplikasi uji.
Buka folder menggunakan editor kode studio visual dengan menggunakan petunjuk di bawah ini -
C:\Users\Admin>mkdir test-app
C:\Users\Admin>cd test-app
C:\Users\Admin\test-app>code.
Langkah 3 - Buat package.json dan Instal Dependensi
Buat file package.json yang akan berisi semua dependensi aplikasi server GraphQL.
{
"name": "hello-world-server",
"private": true,
"scripts": {
"start": "nodemon --ignore data/ server.js"
},
"dependencies": {
"apollo-server-express": "^1.4.0",
"body-parser": "^1.18.3",
"cors": "^2.8.4",
"express": "^4.16.3",
"graphql": "^0.13.2",
"graphql-tools": "^3.1.1"
},
"devDependencies": {
"nodemon": "1.17.1"
}
}
Instal dependensi dengan menggunakan perintah seperti yang diberikan di bawah ini -
C:\Users\Admin\test-app>npm install
Langkah 4 - Buat Database File Datar di Folder Data
Pada langkah ini, kami menggunakan file datar untuk menyimpan dan mengambil data. Buat folder data dan tambahkan dua filestudents.json dan colleges.json.
Berikut ini adalah colleges.json file -
[
{
"id": "col-101",
"name": "AMU",
"location": "Uttar Pradesh",
"rating":5.0
},
{
"id": "col-102",
"name": "CUSAT",
"location": "Kerala",
"rating":4.5
}
]
Berikut ini adalah students.json file -
[
{
"id": "S1001",
"firstName":"Mohtashim",
"lastName":"Mohammad",
"email": "[email protected]",
"password": "pass123",
"collegeId": "col-102"
},
{
"id": "S1002",
"email": "[email protected]",
"firstName":"Kannan",
"lastName":"Sudhakaran",
"password": "pass123",
"collegeId": "col-101"
},
{
"id": "S1003",
"email": "[email protected]",
"firstName":"Kiran",
"lastName":"Panigrahi",
"password": "pass123",
"collegeId": "col-101"
}
]
Langkah 5 - Buat Lapisan Akses Data
Kita perlu membuat datastore yang memuat konten folder data. Dalam hal ini, kita membutuhkan variabel kumpulan, mahasiswa dan perguruan tinggi . Kapanpun aplikasi membutuhkan data, itu menggunakan variabel koleksi ini.
Buat file db.js dengan dalam folder proyek sebagai berikut -
const { DataStore } = require('notarealdb');
const store = new DataStore('./data');
module.exports = {
students:store.collection('students'),
colleges:store.collection('colleges')
};
Langkah 6 - Buat File Skema, schema.graphql
Buat file skema di folder proyek saat ini dan tambahkan konten berikut -
type Query {
test: String
}
Langkah 7 - Buat File Penyelesai, resolvers.js
Buat file resolver di folder proyek saat ini dan tambahkan konten berikut -
const Query = {
test: () => 'Test Success, GraphQL server is up & running !!'
}
module.exports = {Query}
Langkah 8 - Buat Server.js dan Konfigurasi GraphQL
Buat file server dan konfigurasikan GraphQL sebagai berikut -
const bodyParser = require('body-parser');
const cors = require('cors');
const express = require('express');
const db = require('./db');
const port = process.env.PORT || 9000;
const app = express();
const fs = require('fs')
const typeDefs = fs.readFileSync('./schema.graphql',{encoding:'utf-8'})
const resolvers = require('./resolvers')
const {makeExecutableSchema} = require('graphql-tools')
const schema = makeExecutableSchema({typeDefs, resolvers})
app.use(cors(), bodyParser.json());
const {graphiqlExpress,graphqlExpress} = require('apollo-server-express')
app.use('/graphql',graphqlExpress({schema}))
app.use('/graphiql',graphiqlExpress({endpointURL:'/graphql'}))
app.listen(
port, () => console.info(
`Server started on port ${port}`
)
);
Langkah 9 - Jalankan Aplikasi dan Uji dengan GraphiQL
Verifikasi struktur folder project test-app sebagai berikut -
test-app /
-->package.json
-->db.js
-->data
students.json
colleges.json
-->resolvers.js
-->schema.graphql
-->server.js
Jalankan perintah npm start seperti yang diberikan di bawah ini -
C:\Users\Admin\test-app>npm start
Server berjalan di 9000 port, jadi kita bisa menguji aplikasi menggunakan alat GraphiQL. Buka browser dan masukkan URL http: // localhost: 9000 / graphiql. Ketik kueri berikut di editor -
{
Test
}
Tanggapan dari server diberikan di bawah ini -
{
"data": {
"test": "Test Success, GraphQL server is running !!"
}
}
GraphQL adalah spesifikasi yang menggambarkan perilaku server GraphQL. Ini adalah seperangkat pedoman tentang bagaimana permintaan dan tanggapan harus ditangani seperti protokol yang didukung, format data yang dapat diterima oleh server, format tanggapan yang dikembalikan oleh server, dll. Permintaan yang dibuat oleh klien ke GraphQL server disebut Query. Konsep penting lain dari GraphQL adalah agnostik lapisan transportnya. Ini dapat digunakan dengan protokol jaringan yang tersedia seperti TCP, websocket atau protokol lapisan transport lainnya. Ini juga netral untuk database, sehingga Anda dapat menggunakannya dengan database relasional atau NoSQL.
GraphQL Server dapat digunakan dengan menggunakan salah satu dari tiga metode yang tercantum di bawah ini -
- Server GraphQL dengan database yang terhubung
- Server GraphQL yang mengintegrasikan sistem yang ada
- Pendekatan hibrida
GraphQL Server dengan Connected Database
Arsitektur ini memiliki GraphQL Server dengan database terintegrasi dan sering kali dapat digunakan dengan proyek baru. Saat menerima Kueri, server membaca payload permintaan dan mengambil data dari database. Ini disebut menyelesaikan kueri. Tanggapan yang dikembalikan ke klien mengikuti format yang ditentukan dalam spesifikasi resmi GraphQL.
Pada diagram di atas, server GraphQL dan database terintegrasi pada satu node. Klien (desktop / seluler) berkomunikasi dengan server GraphQL melalui HTTP. Server memproses permintaan, mengambil data dari database dan mengembalikannya ke klien.
GraphQL Server Mengintegrasikan Sistem yang Ada
Pendekatan ini bermanfaat bagi perusahaan yang memiliki infrastruktur lama dan API yang berbeda. GraphQL dapat digunakan untuk menyatukan layanan mikro, infrastruktur lama, dan API pihak ketiga di sistem yang ada.
Pada diagram di atas, API GraphQL bertindak sebagai antarmuka antara klien dan sistem yang ada. Aplikasi klien berkomunikasi dengan server GraphQL yang pada gilirannya menyelesaikan kueri.
Pendekatan Hibrid
Terakhir, kita dapat menggabungkan dua pendekatan di atas dan membangun server GraphQL. Dalam arsitektur ini, server GraphQL akan menyelesaikan setiap permintaan yang diterima. Ini akan mengambil data dari database yang terhubung atau dari API terintegrasi. Ini diwakili pada gambar di bawah ini -
Bab ini membahas berbagai komponen GraphQL dan cara mereka berkomunikasi satu sama lain. Seluruh komponen aplikasi dapat dibedakan seperti di bawah ini -
- Komponen Sisi Server
- Komponen Sisi Klien
Komponen Sisi Server
Server GraphQL membentuk komponen inti di sisi server dan memungkinkan untuk mengurai kueri yang berasal dari aplikasi klien GraphQL. Apollo Server adalah implementasi spesifikasi GraphQL yang paling umum digunakan. Komponen pemrograman server lainnya termasuk yang berikut -
Sr.No. | Esensi & Deskripsi Server |
---|---|
1 | Schema Skema GraphQL berada di tengah implementasi server GraphQL dan menjelaskan fungsionalitas yang tersedia untuk klien yang terhubung dengannya. |
2 | Query Kueri GraphQL adalah permintaan aplikasi klien untuk mengambil data dari database atau API lama. |
3 | Resolver Resolver memberikan instruksi untuk mengubah operasi GraphQL menjadi data. Mereka menyelesaikan kueri ke data dengan menentukan fungsi resolver. |
Komponen Sisi Klien
Diberikan di bawah ini adalah komponen sisi klien -
Sr.No. | Alat & Deskripsi |
---|---|
1 | GraphiQL Antarmuka berbasis browser untuk mengedit dan menguji kueri dan mutasi GraphQL. |
2 | ApolloClient Alat terbaik untuk membangun aplikasi klien GraphQL. Terintegrasi dengan baik dengan semua front-end javascript. |
Diagram di bawah ini menunjukkan a Client-Server architecture. Server web dibangun di atas kerangka kerja NodeJs dan Express. Permintaan dibuat ke Apollo GraphQL Server dengan aplikasi ReactJS (dibangun menggunakan pustaka Apollo Client) atau aplikasi browser GraphiQL. Kueri akan diurai dan divalidasi terhadap skema yang ditentukan di server. Jika skema permintaan lolos validasi, maka fungsi resolver terkait akan dijalankan. Penyelesai akan berisi kode untuk mengambil data dari API atau database.
Di bab ini, kita akan membuat API sederhana yang mengembalikan pesan ucapan, HelloWorld, dan mengaksesnya menggunakan GraphiQL.
Contoh
Contoh ini didasarkan pada server NodeJS, Express, dan Apollo. Kita akan belajar menggabungkan semua konsep dengan langkah-langkah berikut -
Langkah 1 - Menyiapkan Express
ExpressJS adalah kerangka aplikasi web yang membantu membangun situs web dan aplikasi web. Dalam contoh ini, kami akan membangun API GraphQL di atas kerangka Express.
Langkah selanjutnya adalah membuat folder hello-world-serverdan arahkan ke folder yang sama dari terminal. Tambahkan package.json, dan beri nama pada paket tersebut. Karena paket ini hanya digunakan secara internal, kami dapat mendeklarasikannya sebagai pribadi.
{
"name":"hello-world-server",
"private":true
}
Instal dependensi untuk server Express seperti yang ditunjukkan di bawah ini -
C:\Users\Admin\hello-world-server>npm install express body-parser cors
body-parser adalah paket middleware yang membantu Express menangani permintaan HTTP Post secara efisien. cors adalah paket middleware lain yang menangani berbagi sumber daya lintas sumber.
Membuat server.js file dalam folder proyek dan ketikkan yang berikut di dalamnya -
const bodyParser = require('body-parser')
const cors = require('cors')
const express = require('express')
const port = process.env.PORT|| 9000
const app = express()
//register middleware
app.use(bodyParser.json() , cors())
app.listen(port, () => console.log(`server is up and running at ${port}`)
Untuk memverifikasi apakah server Express aktif dan berjalan, jalankan kode berikut di jendela terminal -
C:\Users\Admin\hello-world-server>node server.js
Output berikut ditampilkan di konsol server. Ini menunjukkan bahwa server ekspres berjalan pada port 9000.
server is up and running at 9000
Jika Anda membuka browser dan mengetik http://localhost:9000, Anda akan mendapatkan layar berikut -
Untuk menghentikan server, tekan Ctrl + C.
Langkah 2 - Instal GraphQL dan Apollo Server
Sekarang Express telah dikonfigurasi, langkah selanjutnya adalah mengunduh dependensi GraphQL berikut -
- graphql
- graphql-tools
- apollo-server-express@1
Kami akan menggunakan server Apollo v1.0 karena ini adalah rilis stabil. Ketik perintah berikut untuk menginstal dependensi ini -
C:\Users\Admin\hello-world-server>npm install graphql graphql-tools apollo-server-express@1
Kami dapat memverifikasi apakah dependensi ini berhasil diinstal dengan memeriksa package.json file yang kita buat sebelumnya.
{
"name": "hello-world-server",
"private": true,
"dependencies": {
"apollo-server-express": "^1.4.0",
"body-parser": "^1.18.3",
"cors": "^2.8.4",
"express": "^4.16.3",
"graphql": "^0.13.2",
"graphql-tools": "^3.1.1"
}
}
Langkah 3 - Tentukan Skema
Skema GraphQL menentukan jenis objek apa yang dapat diambil dari layanan, dan bidang apa yang dimilikinya. Skema dapat ditentukan menggunakanGraphQL Schema Definition Language. Sekarang, tambahkan potongan kode berikut diserver.js file -
// Adding Type Definitions
const typeDefinition = `
type Query {
greeting: String
}
Di sini, kueri berisi atribut salam yang mengembalikan nilai string .
Langkah 4 - Buat Pemecah Masalah
Langkah pertama dalam membuat resolver adalah menambahkan beberapa kode untuk memproses permintaan bidang salam. Ini ditentukan dalam aresolver. Struktur fungsi resolver harus sesuai dengan skema. Tambahkan cuplikan kode berikut diserver.js mengajukan.
// Adding resolver
const resolverObject = {
Query : {
greeting: () => 'Hello GraphQL From TutorialsPoint !!'
}
}
Langkah kedua adalah mengikat skema dan resolver menggunakan makeExecutableSchema. Fungsi ini telah ditentukan sebelumnya dalam modul graphql-tools. Tambahkan cuplikan kode berikut di server.js mengajukan.
const {makeExecutableSchema} = require('graphql-tools')
const schema = makeExecutableSchema({typeDefs:typeDefinition, resolvers:resolverObject})
Langkah 5 - Tentukan Rute untuk Mengambil Data dari Aplikasi ReactJS / GraphiQL
Tambahkan cuplikan kode berikut di server.js file -
const {graphqlExpress, graphiqlExpress} = require('apollo-server-express')
//create routes for graphql and graphiql
app.use('/graphql',graphqlExpress({schema}))
app.use('/graphiql',graphiqlExpress({endpointURL:'/graphql'}))
Fungsi graphqlExpress membantu mendaftarkan rutehttp://localhost:9000/graphql. Aplikasi ReactJS dapat menggunakan titik akhir ini untuk melakukan kueri data. Demikian pula, fungsi graphqliExpress membantu mendaftarkan rutehttp://localhost:9000/graphiql. Ini akan digunakan oleh klien browser GraphiQL untuk menguji API.
Kode server.js lengkap seperti yang diberikan di bawah ini -
const bodyParser = require('body-parser')
const cors = require('cors')
const express = require('express')
const port = process.env.PORT||9000
const app = express()
app.use(bodyParser.json() , cors())
const typeDefinition = `
type Query {
greeting: String
}`
const resolverObject = {
Query : {
greeting: () => 'Hello GraphQL From TutorialsPoint !!'
}
}
const {makeExecutableSchema} = require('graphql-tools')
const schema = makeExecutableSchema({typeDefs:typeDefinition, resolvers:resolverObject})
const {graphqlExpress,graphiqlExpress} = require('apollo-server-express')
app.use('/graphql',graphqlExpress({schema}))
app.use('/graphiql',graphiqlExpress({endpointURL:'/graphql'}))
app.listen(port, () => console.log(`server is up and running ${port}`))
Langkah 6 - Mulai Aplikasi
Menjalankan server.js menggunakan Node.js sebagai berikut -
C:\Users\Admin\hello-world-server>node server.js
Langkah 7 - Uji API GraphQL
Buka browser dan ketik http://localhost:9000/graphiql. Di tab kueri GraphiQL, masukkan berikut ini -
{
greeting
}
Tanggapan dari server diberikan di bawah ini -
{
"data": {
"greeting": "Hello GraphQL From TutorialsPoint !!"
}
}
Gambar berikut mengilustrasikan respons -
Note - Harap pastikan bahwa Apollo Server Versi 1.0 digunakan.
GraphQL adalah bahasa yang diketik dengan kuat. Type System mendefinisikan berbagai tipe data yang dapat digunakan dalam aplikasi GraphQL. Sistem tipe membantu untuk menentukan skema, yang merupakan kontrak antara klien dan server. Jenis data GraphQL yang umum digunakan adalah sebagai berikut -
Sr.No. | Jenis & Deskripsi |
---|---|
1 | Scalar Menyimpan satu nilai |
2 | Object Menunjukkan jenis objek yang bisa diambil |
3 | Query Jenis titik masuk ke jenis khusus lainnya |
4 | Mutation Titik masuk untuk manipulasi data |
5 | Enum Berguna dalam situasi di mana Anda membutuhkan pengguna untuk memilih dari daftar opsi yang ditentukan |
Jenis Skalar
Tipe skalar adalah tipe data primitif yang hanya dapat menyimpan satu nilai. Jenis skalar default yang ditawarkan GraphQL adalah -
Int - Integer 32-bit yang ditandatangani
Float - Nilai floating point presisi ganda yang ditandatangani
String - UTF - urutan 8 karakter
Boolean - Benar atau salah
ID - Pengenal unik, sering digunakan sebagai pengenal unik untuk mengambil objek atau sebagai kunci cache.
Sintaks untuk mendefinisikan tipe skalar adalah sebagai berikut -
field: data_type
Potongan yang diberikan di bawah ini mendefinisikan bidang bernama salam yang mengembalikan nilai String.
greeting: String
Jenis Objek
Tipe objek adalah tipe yang paling umum digunakan dalam skema dan mewakili sekelompok bidang. Setiap bidang di dalam tipe objek dipetakan ke tipe lain, sehingga memungkinkan tipe bertingkat. Dengan kata lain, sebuah tipe objek terdiri dari beberapa tipe skalar atau tipe objek.
Sintaks untuk mendefinisikan tipe objek diberikan di bawah ini -
type object_type_name
{
field1: data_type
field2:data_type
....
fieldn:data_type
}
Anda dapat mempertimbangkan cuplikan kode berikut -
--Define an object type--
type Student {
stud_id:ID
firstname: String
age: Int
score:Float
}
--Defining a GraphQL schema--
type Query
{
stud_details:[Student]
}
Contoh yang diberikan di atas mendefinisikan Student tipe data objek. Bidang stud_details di root Query schema akan mengembalikan daftar objek Student.
Jenis Kueri
Kueri GraphQL digunakan untuk mengambil data. Ini seperti meminta sumber daya dalam API berbasis REST. Sederhananya, tipe Query adalah permintaan yang dikirim dari aplikasi klien ke server GraphQL. GraphQL menggunakanSchema Definition Language (SDL)untuk mendefinisikan Query. Jenis kueri adalah salah satu dari banyak jenis tingkat akar di GraphQL.
Sintaks untuk mendefinisikan Query adalah seperti yang diberikan di bawah ini -
type Query {
field1: data_type
field2:data_type
field2(param1:data_type,param2:data_type,...paramN:data_type):data_type
}
Contoh mendefinisikan Query -
type Query {
greeting: String
}
Jenis Mutasi
Mutasi adalah operasi yang dikirim ke server ke create, update atau deletedata. Ini analog dengan kata kerja PUT, POST, PATCH dan DELETE untuk memanggil API berbasis REST.
Mutasi adalah salah satu tipe data tingkat akar di GraphQL. Jenis Query mendefinisikan titik masuk untuk operasi pengambilan data sedangkan jenis Mutasi menentukan titik masuk untuk operasi manipulasi data.
Sintaks untuk mendefinisikan tipe Mutasi diberikan di bawah ini -
type Mutation {
field1: data_type
field2(param1:data_type,param2:data_type,...paramN:data_type):data_type
}
Sebagai contoh, kita dapat mendefinisikan tipe mutasi untuk menambah Mahasiswa baru seperti di bawah ini -
type Mutation {
addStudent(firstName: String, lastName: String): Student
}
Jenis Enum
Enum mirip dengan tipe skalar. Enum berguna dalam situasi di mana nilai bidang harus dari daftar opsi yang ditentukan.
Sintaks untuk mendefinisikan tipe Enum adalah -
type enum_name{
value1
value2
}
Cuplikan berikut menggambarkan bagaimana jenis enum dapat didefinisikan -
type Days_of_Week{
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
}
Jenis Daftar
Daftar dapat digunakan untuk mewakili larik nilai dengan tipe tertentu. Daftar didefinisikan dengan pengubah tipe [] yang membungkus tipe objek, skalar, dan enum.
Sintaks berikut dapat digunakan untuk menentukan jenis daftar -
field:[data_type]
Contoh di bawah ini mendefinisikan tipe daftar todos -
type Query {
todos: [String]
}
Jenis Non-Nullable
Secara default, setiap jenis skalar inti dapat disetel ke nol. Dengan kata lain, tipe ini dapat mengembalikan nilai dari tipe yang ditentukan atau tidak memiliki nilai. Untuk mengesampingkan default ini dan menetapkan bahwa bidang harus ditentukan, tanda seru (!) Dapat ditambahkan ke jenis. Ini memastikan adanya nilai dalam hasil yang dikembalikan oleh kueri.
Sintaks berikut dapat digunakan untuk menentukan bidang non-nullable -
field:data_type!
Dalam contoh di bawah ini, stud_id dideklarasikan sebagai bidang wajib.
type Student {
stud_id:ID!
firstName:String
lastName:String
fullName:String
college:College
}
Skema GraphQL adalah inti dari implementasi server GraphQL apa pun. Ini menjelaskan fungsionalitas yang tersedia untuk aplikasi klien yang terhubung dengannya. Kita dapat menggunakan bahasa pemrograman apa pun untuk membuat skema GraphQL dan membangun antarmuka di sekitarnya.
Runtime GraphQL mendefinisikan skema berbasis grafik generik untuk mempublikasikan kemampuan layanan data yang diwakilinya. Aplikasi klien dapat menanyakan skema dalam kemampuannya. Pendekatan ini memisahkan klien dari server dan memungkinkan keduanya berkembang dan menskalakan secara mandiri.
Di bab ini, kami menggunakan server Apollo untuk mengeksekusi kueri GraphQL. ItumakeExecutableSchema fungsi di graphql-tools membantu Anda mengikat skema dan resolver.
makeExecutableSchema Function Syntax
Itu makeExecutableSchemafungsi mengambil argumen tunggal {} dari tipe Objek. Sintaks untuk menggunakan fungsi ini diberikan di bawah ini -
import { makeExecutableSchema } from 'graphql-tools';
const jsSchema = makeExecutableSchema({
typeDefs,
resolvers, // optional
logger, // optional
allowUndefinedInResolve = false, // optional
resolverValidationOptions = {}, // optional
directiveResolvers = null, // optional
schemaDirectives = null, // optional
parseOptions = {}, // optional
inheritResolversFromInterfaces = false // optional
});
Sr.No. | Parameter & Deskripsi |
---|---|
1 | typeDefs Ini adalah argumen yang diperlukan. Ini mewakili kueri GraphQL sebagai string UTF-8. |
2 | Resolvers Ini adalah argumen opsional (objek kosong secara default). Ini memiliki fungsi yang menangani kueri. |
3 | logger Ini adalah argumen opsional dan dapat digunakan untuk mencetak kesalahan ke konsol server. |
4 | parseOptions Ini adalah argumen opsional dan memungkinkan kustomisasi parse saat menentukan typeDefs sebagai string. |
5 | allowUndefinedInResolve Ini benar secara default. Ketika disetel ke false, menyebabkan fungsi penyelesaian Anda menampilkan kesalahan jika kembali tidak ditentukan. |
6 | resolverValidationOptions Ini adalah argumen opsional dan menerima objek dengan properti Boolean. |
7 | inheritResolversFromInterfaces Ini adalah argumen opsional dan menerima argumen Boolean untuk memeriksa pewarisan objek resolver. |
Ilustrasi
Mari kita buat aplikasi sederhana untuk memahami skema ini. Ini akan membuat skema untuk menanyakan daftar siswa dari server. Data siswa akan disimpan dalam bentuk flat file dan kita akan menggunakan modul node bernamanotarealdb untuk memalsukan database dan membaca dari file datar.
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder bernama schema-app. Ubah direktori Anda menjadi aplikasi skema dari terminal. Kemudian, ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan untuk menyelesaikan pengunduhan dan proses instalasi.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di folder proyek, schema-app dan tambahkan kode berikut -
type Query {
greeting:String
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
password:String
collegeId:String
}
Akar skema adalah tipe Query. Kueri memiliki dua bidang - salam dan Siswa yang mengembalikan String dan daftar siswa masing-masing. Mahasiswa dideklarasikan sebagai tipe Objek karena berisi beberapa bidang. Bidang ID dideklarasikan sebagai non-nullable.
Langkah 3 - Buat Pemecah Masalah
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const db = require('./db')
const Query = {
greeting:() => {
return "hello from TutorialsPoint !!!"
},
students:() => db.students.list()
}
module.exports = {Query}
Disini sapaan dan siswa adalah resolver yang menangani query tersebut. students resolver functionmengembalikan daftar siswa dari lapisan akses data. Untuk mengakses fungsi resolver di luar modul, objek Query harus diekspor menggunakanmodule.exports.
Langkah 4 - Jalankan Aplikasi
Buat file server.js dan lihat langkah 8 di Bab Pengaturan Lingkungan. Langkah selanjutnya adalah menjalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi. Buka browser dan ketik URL,http://localhost:9000/graphiql.
Ketik kueri berikut di editor -
{
greeting
students {
id
firstName
lastName
}
}
Kueri akan menampilkan output seperti yang ditunjukkan di bawah ini -
Note- Kita dapat mengganti students.json dengan panggilan RESTful API untuk mengambil data siswa atau bahkan database nyata seperti MySQL atau MongoDB. GraphQL menjadi pembungkus tipis di sekitar lapisan aplikasi asli Anda untuk meningkatkan kinerja.
Resolver adalah kumpulan fungsi yang menghasilkan respons untuk kueri GraphQL. Secara sederhana, resolver bertindak sebagai penangan kueri GraphQL. Setiap fungsi resolver dalam skema GraphQL menerima empat argumen posisi seperti yang diberikan di bawah ini -
fieldName:(root, args, context, info) => { result }
Contoh fungsi resolver ditunjukkan di bawah ini -
//resolver function with no parameters and returning string
greeting:() => {
return "hello from TutorialsPoint !!!"
}
//resolver function with no parameters and returning list
students:() => db.students.list()
//resolver function with arguments and returning object
studentById:(root,args,context,info) => {
return db.students.get(args.id);
}
Diberikan di bawah ini adalah argumen posisi dan deskripsinya -
Sr.No. | Argumen & Deskripsi |
---|---|
1 | root Objek yang berisi hasil yang dikembalikan dari resolver di bidang induk. |
2 | args Objek dengan argumen yang diteruskan ke bidang dalam kueri. |
3 | context Ini adalah objek yang dibagikan oleh semua resolver dalam kueri tertentu. |
4 | info Ini berisi informasi tentang status eksekusi kueri, termasuk nama bidang, jalur ke bidang dari root. |
Format Hasil Penyelesai
Resolver di GraphQL dapat mengembalikan berbagai jenis nilai seperti yang diberikan di bawah ini -
Sr.No. | Argumen dan Deskripsi |
---|---|
1 | null or undefined ini menunjukkan bahwa objek tidak dapat ditemukan |
2 | array ini hanya valid jika skema menunjukkan bahwa hasil bidang harus berupa daftar |
3 | promise resolver sering kali melakukan tindakan asinkron seperti mengambil dari database atau API backend, sehingga dapat mengembalikan promise |
4 | scalar or object resolver juga bisa mengembalikan nilai lain |
Ilustrasi
Mari kita buat aplikasi sederhana untuk memahami resolver. Ini akan membuat skema untuk menanyakan siswa berdasarkan id dari server. Data siswa akan disimpan dalam bentuk flat file dan kita akan menggunakan modul node bernamanotarealdb untuk memalsukan database dan membaca dari file datar.
Berikut ini adalah proses langkah bijak untuk membuat aplikasi sederhana -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder bernama resolver-app. Ubah direktori Anda menjadiresolver-appdari terminal. Kemudian, ikuti langkah 3 hingga 5 di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Tambahkan file schema.graphql di folder proyek resolver-app dan tambahkan kode berikut -
type Query {
greeting:String
students:[Student]
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
password:String
collegeId:String
}
File skema menunjukkan bahwa pengguna dapat melakukan kueri untuk salam, siswa, dan studentById . Untuk mengambil siswa dengan id tertentu, kami menggunakandata type ID!yang menunjukkan bidang pengenal unik yang tidak dapat dinihilkan. Bidang siswa mengembalikan larik siswa, dan salam mengembalikan nilai string sederhana.
Langkah 3 - Buat Pemecah Masalah
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const db = require('./db')
const Query = {
//resolver function for greeting
greeting:() => {
return "hello from TutorialsPoint !!!"
},
//resolver function for students returns list
students:() => db.students.list(),
//resolver function for studentbyId
studentById:(root,args,context,info) => {
//args will contain parameter passed in query
return db.students.get(args.id);
}
}
module.exports = {Query}
Di sini, studentById mengambil tiga parameter. Seperti yang didiskusikan dalam bab ini, studentId bisa diambil dari args; root akan berisi objek Query itu sendiri. Untuk mengembalikan siswa tertentu, kita perlu memanggil metode get dengan parameter id di koleksi siswa.
Di sini salam, siswa, studentById adalah resolver yang menangani kueri.students resolver functionmengembalikan daftar siswa dari lapisan akses data. Untuk mengakses fungsi resolver di luar modul, objek Query harus diekspor menggunakan module.exports.
Langkah 4 - Jalankan Aplikasi
Buat file server.js. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan masukkan url, http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
studentById(id:"S1001") {
id
firstName
lastName
}
}
Output untuk query di atas adalah seperti yang ditunjukkan di bawah ini -
{
"data": {
"studentById": {
"id": "S1001",
"firstName": "Mohtashim",
"lastName": "Mohammad"
}
}
}
Operasi GraphQL dapat berupa operasi baca atau tulis. Kueri GraphQL digunakan untuk membaca atau mengambil nilai sementara mutasi digunakan untuk menulis atau memposting nilai. Dalam kedua kasus tersebut, operasinya adalah string sederhana yang dapat diurai dan ditanggapi oleh server GraphQL dengan data dalam format tertentu. Format respons populer yang biasanya digunakan untuk aplikasi seluler dan web adalah JSON.
Sintaks untuk mendefinisikan query adalah sebagai berikut -
//syntax 1
query query_name{ someField }
//syntax 2
{ someField }
Berikut adalah contoh kueri -
//query with name myQuery
query myQuery{
greeting
}
// query without any name
{
greeting
}
Jelas dari contoh di atas bahwa kata kunci kueri bersifat opsional.
Kueri GraphQL membantu mengurangi pengambilan data yang berlebihan. Tidak seperti Restful API, GraphQL memungkinkan pengguna membatasi bidang yang harus diambil dari server. Ini berarti kueri yang lebih kecil dan lalu lintas yang lebih sedikit melalui jaringan; yang pada gilirannya mengurangi waktu respons.
Ilustrasi 1 - Membuat Kueri Model Siswa dengan Bidang Kustom
Dalam contoh ini, kami memiliki satu set siswa yang disimpan dalam file json. Setiap model siswa memiliki field seperti firstName, lastName dan id tetapi tidak ada fullName. Di sini, kami akan membahas cara membuat kueri untuk mengambil nama lengkap semua siswa. Untuk ini, kita perlu membuat kolom fullName di kedua resolver skema.
Mari kita lihat bagaimana melakukan ilustrasi ini menggunakan langkah-langkah di bawah ini -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder bernama query-app. Ubah direktori Anda menjadiquery-appdari terminal. Kemudian, ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di aplikasi kueri folder proyek dan tambahkan kode berikut -
type Query {
greeting:String
students:[Student]
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
fullName:String
}
Perhatikan bahwa tidak ada fullName lapangan distudents.jsonmengajukan. Namun, kami perlu mengambil nama lengkap siswa melalui kueri. The fullName , dalam hal ini akan menjadi bidang khusus yang tidak tersedia dengan sumber data.
Langkah 3 - Buat Pemecah Masalah
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const db = require('./db')
const Query = {
//resolver function for greeting
greeting:() => {
return "hello from TutorialsPoint !!!"
},
//resolver function for students returns list
students:() => db.students.list(),
//resolver function for studentbyId
studentById:(root,args,context,info) => {
//args will contain parameter passed in query
return db.students.get(args.id);
}
}
//for each single student object returned,resolver is invoked
const Student = {
fullName:(root,args,context,info) => {
return root.firstName+":"+root.lastName
}
}
module.exports = {Query,Student}
Langkah 4 - Jalankan Aplikasi
Membuat server.jsmengajukan. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
students{
id
fullName
}
}
Tanggapan untuk pertanyaan diberikan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"fullName": "Mohtashim:Mohammad"
},
{
"id": "S1002",
"fullName": "Kannan:Sudhakaran"
},
{
"id": "S1003",
"fullName": "Kiran:Panigrahi"
}
]
}
}
Membuat server.js dan tambahkan kode berikut -
const bodyParser = require('body-parser');
const cors = require('cors');
const express = require('express');
const db = require('./db');
const port = 9000;
const app = express();
//loading type definitions from schema file
const fs = require('fs')
const typeDefs = fs.readFileSync('./schema.graphql',{encoding:'utf-8'})
//loading resolvers
const resolvers = require('./resolvers')
//binding schema and resolver
const {makeExecutableSchema} = require('graphql-tools')
const schema = makeExecutableSchema({typeDefs, resolvers})
//enabling cross domain calls and form post
app.use(cors(), bodyParser.json());
//enabling routes
const {graphiqlExpress,graphqlExpress} = require('apollo-server-express')
app.use('/graphql',graphqlExpress({schema}))
app.use('/graphiql',graphiqlExpress({endpointURL:'/graphql'}))
//registering port
app.listen(port, () => console.info(`Server started on port ${port}`));
Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
students{
id
fullName
}
}
Tanggapan untuk pertanyaan diberikan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"fullName": "Mohtashim:Mohammad"
},
{
"id": "S1002",
"fullName": "Kannan:Sudhakaran"
},
{
"id": "S1003",
"fullName": "Kiran:Panigrahi"
}
]
}
}
Ilustrasi 2 - Kueri Bertingkat
Mari kita buat kueri berlapis untuk mengambil detail siswa dan detail perguruan tinggi mereka. Kami akan bekerja dengan folder proyek yang sama.
Langkah 1 - Edit Skema
File skema sudah memiliki bidang siswa . Mari kita tambahkan field college dan tentukan tipenya.
type College {
id:ID!
name:String
location:String
rating:Float
}
type Student {
id:ID!
firstName:String
lastName:String
fullName:String
college:College
}
Langkah 2 - Ubah resolver.js
Kita perlu menambahkan fungsi resolver perguruan tinggi seperti di bawah ini. Fungsi resolver perguruan tinggi akan dijalankan untuk setiap objek siswa yang dikembalikan. Parameter root resolver dalam hal ini akan berisi siswa .
const Student = {
fullName:(root,args,context,info) => {
return root.firstName+":"+root.lastName
},
college:(root) => {
return db.colleges.get(root.collegeId);
}
}
module.exports = {Query,Student}
Penyelesai mengembalikan perguruan tinggi dari setiap siswa dengan memanggil metode get koleksi perguruan tinggi dan lulus collegeId . Kami memiliki hubungan asosiasi antara Mahasiswa dan Perguruan Tinggi melalui CollegeId .
Langkah 3 - Uji Aplikasi
Buka jendela terminal dan arahkan ke folder proyek. Ketik perintah -npm start. Luncurkan browser dan masukkan URLhttp://localhost:9000/graphiql.
Masukkan kueri berikut di jendela GraphiQL -
{
students{
id
firstName
college {
id
name
location
rating
}
}
}
Tanggapan untuk pertanyaan tersebut adalah seperti yang diberikan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim",
"college": {
"id": "col-102",
"name": "CUSAT",
"location": "Kerala",
"rating": 4.5
}
},
{
"id": "S1002",
"firstName": "Kannan",
"college": {
"id": "col-101",
"name": "AMU",
"location": "Uttar Pradesh",
"rating": 5
}
},
{
"id": "S1003",
"firstName": "Kiran",
"college": {
"id": "col-101",
"name": "AMU",
"location": "Uttar Pradesh",
"rating": 5
}
}
]
}
}
Apa itu Variabel Kueri?
Jika kueri memiliki beberapa nilai dinamis untuk diteruskan, maka mewakili nilai dinamis ini menggunakan variabel. Karenanya, kueri dapat digunakan kembali oleh aplikasi klien.
Ilustrasi
Mari kita buat aplikasi sederhana untuk memahami variabel kueri.
Langkah 1 - Edit File Skema
Tambahkan bidang sayHello yang mengambil parameter string dan mengembalikan string. Nilai nama akan dinamis dalam aplikasi klien.
type Query {
sayHello(name:String!):String
}
Langkah 2 - Edit File resolver.js
Tambahkan resolver sayHello yang mengambil parameter seperti di bawah ini -
sayHello:(root,args,context,info) => `Hi ${args.name} GraphQL server says Hello to you!!`
Langkah 3 - Deklarasikan Variabel Kueri di GraphiQL
Variabel dideklarasikan dengan $ diikuti dengan nama variabel. Misalnya: $ myname_Variable.
Setelah $ myname_Variable dideklarasikan, itu harus digunakan dengan sintaks kueri bernama. Kueri, myQuery mengambil nilai string dan meneruskannya ke sayHello seperti yang ditunjukkan di bawah ini -
query myQuery($myname_Variable:String!) { sayHello(name:$myname_Variable)
}
Tetapkan nilai untuk $ myname_Variable sebagai objek JSON di bagian Variabel Kueri klien GraphiQL.
{
"myname_Variable": "Mohtashim"
}
Output dari kode di atas adalah sebagai berikut -
{
"data": {
"sayHello": "Hi Mohtashim GraphQL server says Hello to you!!"
}
}
Cara menggunakan Variabel Kueri dengan Enum
Mari kita lihat cara menggunakan variabel kueri jika parameter bidang adalah enum type.
Langkah 1 - Edit File schema.graphql
enum ColorType {
RED
BLUE
GREEN
}
type Query {
setFavouriteColor(color:ColorType):String
}
Fungsi setFavouriteColor menggunakan enum sebagai masukan dan mengembalikan nilai string.
Langkah 2 - Edit File resolvers.js
Fungsi resolver setFavouriteColor mengambil root dan args . Nilai enum yang diteruskan ke fungsi saat runtime dapat diakses melalui parameter args.
setFavouriteColor:(root,args) => {
return "Your Fav Color is :"+args.color;
}
Langkah 3 - Deklarasikan Variabel Query di GraphiQL
Kueri diberi nama query_to_setColoryang mengambil variabel dengan nama color_variable of ColorType. Variabel ini diteruskan ke metode setFavouriteColor.
query query_to_setColor($color_variable:ColorType) {
setFavouriteColor(color:$color_variable)
}
Di bagian variabel kueri GraphiQL, ketik kode berikut -
{
"color_variable":"RED"
}
Tanggapannya ditunjukkan di bawah ini -
{
"data": {
"setFavouriteColor": "Your Fav Color is: RED"
}
}
Pada bab ini, kita akan mempelajari kueri mutasi di GraphQL.
Kueri mutasi mengubah data di penyimpanan data dan mengembalikan nilai. Ini dapat digunakan untuk memasukkan, memperbarui, atau menghapus data. Mutasi didefinisikan sebagai bagian dari skema.
Sintaks kueri mutasi diberikan di bawah ini -
mutation{
someEditOperation(dataField:"valueOfField"):returnType
}
Ilustrasi
Mari kita memahami cara menambahkan catatan siswa baru ke dalam datastore menggunakan kueri mutasi.
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder proyek dengan nama mutation-app. Ubah direktori Anda menjadi aplikasi mutasi dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat File schema.graphql
Menambahkan schema.graphql file dalam aplikasi mutasi folder proyek dan tambahkan kode berikut -
type Query {
greeting:String
}
type Mutation {
createStudent(collegeId:ID,firstName:String,lastName:String):String
}
Perhatikan bahwa fungsi createStudent mengembalikan tipe String. Ini adalah pengenal unik (ID) yang dihasilkan setelah membuat siswa.
Langkah 3 - Buat File resolver.js
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const db = require('./db')
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName})
}
}
const Query = {
greeting:() => "hello"
}
module.exports = {Query,Mutation}
Fungsi mutasi menunjuk ke koleksi siswa di datastore. Untuk menambahkan siswa baru , panggil metode buat di koleksi siswa. The args objek akan berisi parameter yang dilewatkan dalam query. Metode buat koleksi siswa akan mengembalikan id dari objek siswa yang baru dibuat.
Langkah 4 - Jalankan Aplikasi
Membuat server.jsmengajukan. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Langkah selanjutnya adalah membuka browser dan mengetik URL http://localhost:9000/graphiql. Ketik kueri berikut di editor -
//college Id should be matched with data from colleges.json for easy retrieval
mutation {
createStudent(collegeId:"col-2",firstName:"Tim",lastName:"George")
}
Kueri di atas akan membuat objek siswa di file student.json. Kueri akan mengembalikan pengenal unik. Respon dari query tersebut seperti yang ditunjukkan di bawah ini -
{
"data": {
"createStudent": "SkQtxYBUm"
}
}
Untuk memverifikasi jika objek siswa dibuat, kita dapat menggunakan kueri studentById. Anda juga dapat membuka file students.json dari folder data untuk memverifikasi id.
Untuk menggunakan kueri studentById, edit schema.graphql seperti yang diberikan di bawah ini -
type Query {
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
collegeId:String
}
Edit resolver.js file seperti yang diberikan di bawah ini -
const db = require('./db')
const Query = {
studentById:(root,args,context,info) => {
return db.students.get(args.id);
}
}
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName})
}
}
module.exports = {Query,Mutation}
Diberikan di bawah ini adalah kueri untuk mendapatkan siswa dengan id unik yang dikembalikan dari kueri mutasi -
{
studentById(id:"SkQtxYBUm") {
id
firstName
lastName
}
}
Tanggapan dari server adalah sebagai berikut -
{
"data": {
"studentById": {
"id": "SkQtxYBUm",
"firstName": "Tim",
"lastName":"George"
}
}
}
Mengembalikan Objek dalam Mutasi
Merupakan praktik terbaik untuk mengembalikan objek dalam mutasi. Misalnya, aplikasi klien ingin mengambil detail siswa dan perguruan tinggi. Dalam kasus ini, daripada membuat dua permintaan berbeda, kita bisa membuat kueri yang mengembalikan objek yang berisi siswa dan detail perguruan tinggi mereka.
Langkah 1 - Edit File Skema
Tambahkan metode baru bernama addStudent yang mengembalikan objek dalam tipe mutasi schema.graphql.
Mari kita pelajari cara mengakses detail perguruan tinggi melalui detail siswa. Tambahkan jenis perguruan tinggi di file skema.
type Mutation {
addStudent_returns_object(collegeId:ID,firstName:String,lastName:String):Student
createStudent(collegeId:ID,firstName:String,lastName:String):String
}
type College {
id:ID!
name:String
location:String
rating:Float
}
type Student {
id:ID!
firstName:String
lastName:String
college:College
}
Langkah 2 - Perbarui File resolvers.js
Perbarui file resolvers.js di folder proyek dan tambahkan kode berikut -
const Mutation = {
createStudent:(root,args,context,info) => {
return db.students.create({
collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName
})
},
// new resolver function
addStudent_returns_object:(root,args,context,info) => {
const id = db.students.create({
collegeId:args.collegeId,
firstName:args.firstName,
lastName:args.lastName
})
return db.students.get(id)
}
}
//for each single student object returned,resolver is invoked
const Student = {
college:(root) => {
return db.colleges.get(root.collegeId);
}
}
module.exports = {Query,Student,Mutation}
Langkah 3 - Mulai Server dan Ketik Permintaan Permintaan di GraphiQL
Selanjutnya, kita akan memulai server dan meminta query di GraphiQL dengan kode berikut -
mutation {
addStudent_returns_object(collegeId:"col-101",firstName:"Susan",lastName:"George") {
id
firstName
college{
id
name
}
}
}
Kueri di atas menambahkan siswa baru dan mengambil objek siswa bersama dengan objek perguruan tinggi. Ini menghemat perjalanan bolak-balik ke server.
Tanggapannya seperti yang diberikan di bawah ini -
{
"data": {
"addStudent_returns_object": {
"id": "rklUl08IX",
"firstName": "Susan",
"college": {
"id": "col-101",
"name": "AMU"
}
}
}
}
Saat menambahkan atau memodifikasi data, penting untuk memvalidasi input pengguna. Misalnya, kita mungkin perlu memastikan bahwa nilai bidang selalu tidak null. Kita bisa gunakan! (non-nullable) ketik penanda di GraphQL untuk melakukan validasi tersebut.
Sintaks untuk menggunakan file ! jenis penanda seperti yang diberikan di bawah ini -
type TypeName {
field1:String!,
field2:String!,
field3:Int!
}
Sintaks di atas memastikan bahwa semua field tidak null.
Jika kita ingin menerapkan aturan tambahan seperti memeriksa panjang string atau memeriksa apakah suatu angka berada dalam kisaran tertentu, kita dapat menentukan validator khusus. Logika validasi kustom akan menjadi bagian dari fungsi resolver. Mari kita pahami ini dengan bantuan sebuah contoh.
Ilustrasi - Menerapkan Validator Kustom
Mari kita buat formulir pendaftaran dengan validasi dasar. Formulir akan memiliki bidang email, nama depan dan kata sandi.
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder bernama validation-app. Ubah direktori menjadi aplikasi validasi dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di folder proyek validation-app dan tambahkan kode berikut -
type Query {
greeting:String
}
type Mutation {
signUp(input:SignUpInput):String
}
input SignUpInput {
email:String!,
password:String!,
firstName:String!
}
Note- Kita dapat menggunakan tipe input SignUpInput untuk mengurangi jumlah parameter dalam fungsi signUp. Jadi, fungsi signUp hanya membutuhkan satu parameter bertipe SignUpInput.
Langkah 3 - Buat Penyelesai
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const Query = {
greeting:() => "Hello"
}
const Mutation ={
signUp:(root,args,context,info) => {
const {email,firstName,password} = args.input;
const emailExpression = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
const isValidEmail = emailExpression.test(String(email).toLowerCase())
if(!isValidEmail)
throw new Error("email not in proper format")
if(firstName.length > 15)
throw new Error("firstName should be less than 15 characters")
if(password.length < 8 )
throw new Error("password should be minimum 8 characters")
return "success";
}
}
module.exports = {Query,Mutation}
Fungsi resolver, signUp menerima email parameter, kata sandi dan nama depan. Ini akan dilewatkan melalui variabel input sehingga dapat diakses melalui args.input.
Langkah 4 - Jalankan Aplikasi
Buat file server.js. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami akan menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan masukkan URL http://localhost:9000/graphiql. Ketik kueri berikut di editor -
mutation doSignUp($input:SignUpInput) { signUp(input:$input)
}
Karena input ke fungsi signup adalah tipe yang kompleks, kita perlu menggunakan variabel query dalam graphiql. Untuk ini, pertama-tama kita perlu memberi nama pada kueri dan menyebutnya doSignUp, $ input adalah variabel kueri.
Variabel kueri berikut harus dimasukkan di tab variabel kueri dari graphiql -
{
"input":{
"email": "abc@abc",
"firstName": "kannan",
"password": "pass@1234"
}
}
Array kesalahan berisi detail kesalahan validasi seperti yang ditunjukkan di bawah ini -
{
"data": {
"signUp": null
},
"errors": [
{
"message": "email not in proper format",
"locations": [
{
"line": 2,
"column": 4
}
],
"path": [
"signUp"
]
}
]
}
Kami harus memasukkan input yang tepat untuk setiap bidang seperti yang diberikan di bawah ini -
{
"input":{
"email": "[email protected]",
"firstName": "kannan",
"password": "pass@1234"
}
}
Tanggapannya adalah sebagai berikut -
{
"data": {
"signUp": "success"
}
}
Di sini, dalam kueri di bawah ini, kami tidak memberikan kata sandi apa pun.
{
"input":{
"email": "[email protected]",
"firstName": "kannan"
}
}
Jika bidang yang diperlukan tidak tersedia, maka server qraphql akan menampilkan kesalahan berikut -
{
"errors": [
{
"message": "Variable \"$input\" got invalid value {\"email\":\"[email protected]\",\"firstName\":\"kannan\"}; Field value.password of required type String! was not provided.",
"locations": [
{
"line": 1,
"column": 19
}
]
}
]
}
Aplikasi web mengirim dan mengambil data secara asinkron (di latar belakang). AJAX memungkinkan situs web memuat konten ke layar tanpa menyegarkan halaman. jQuery menyediakan beberapa metode untuk fungsionalitas AJAX sehingga memudahkan penggunaan AJAX. Pada bab ini, kita akan mempelajari bagaimana kita dapat mengintegrasikan GraphQL dengan jQuery.
Pertimbangkan aplikasi yang menggunakan arsitektur server klien. Kita dapat membangun halaman web ujung depan yang meminta data dari server GraphQL. Halaman web akan membuat panggilan AJAX menggunakan jQuery ke server GraphQL.
Untuk mengintegrasikan GraphQL dengan JQuery, mari kita periksa header permintaan GraphiQL dan pahami parameter permintaannya.
Memulai hello-worldaplikasi (lihat bab 6 untuk ilustrasi yang relevan). Ketik kueri graphql {salam} di jendela GraphiQL. Klik kanan dan periksa atau tekan (ctrl + shift + I) di chrome untuk membuka tab jaringan seperti yang ditunjukkan di bawah ini -
Dari yang sederhana hello-world Misalnya, kita bisa mengerti itu http method digunakan adalah POST. Sekarang di browser, gulir ke bawah ke bagian header untuk melihat payload permintaan .
Setelah Anda mengklik view code, Anda akan melihat yang berikut ini di bagian muatan permintaan di chrome.
{"query":"{\n greeting\n}","variables":null,"operationName":null}
Perhatikan juga URL permintaannya, http://localhost:9000/graphql yang harus dipanggil dari aplikasi klien.
Ilustrasi
Mari kita pahami cara mengintegrasikan GraphQL dengan JQuery menggunakan proses langkah-bijaksana.
Menyiapkan Server
Kami akan belajar mengatur server menggunakan langkah-langkah berikut -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder bernama jquery-server-app. Ubah direktori Anda menjadi jquery-server-app dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Tambahkan file schema.graphql di folder proyek jquery-server-app dan tambahkan kode berikut -
type Query
{
greeting: String
sayHello(name:String!):String
}
File tersebut telah menetapkan dua kueri greeting dan sayHello. Kueri sayHello menerima parameter string dan mengembalikan string lain. Parameter ke fungsi sayHello () tidak null.
Langkah 3 - Buat Penyelesai
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const Query =
{
greeting: () => 'Hello GraphQL From TutorialsPoint !!' ,
sayHello:(root,args,context,info) => `Hi ${args.name} GraphQL server says Hello to you!!`
}
module.exports = {Query}
Sini, greeting dan sayHelloadalah dua resolver. Dalam resolver sayHello, nilai yang diteruskan ke parameter nama dapat diakses melalui args. Untuk mengakses fungsi resolver di luar modul, objek Query harus diekspor menggunakanmodule.exports.
Langkah 4 - Jalankan Aplikasi
Buat file server.js. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
greeting,
sayHello(name:"Mohtashim")
}
Tanggapan dari server seperti yang diberikan di bawah ini -
{
"data": {
"greeting": "Hello GraphQL From TutorialsPoint !!",
"sayHello": "Hi Mohtashim GraphQL server says Hello to you!!"
}
}
Menyiapkan Klien
Karena, kita sudah menyiapkan server, sekarang kita akan belajar cara mengatur klien.
Langkah 1 - Buat folder baru jquery-client-app di luar folder proyek saat ini
Pertama, kita akan membuat folder bernama jquery-client-app di luar folder proyek.
Langkah 2 - Buat Halaman HTML index.html untuk Integrasi jQuery
Kami akan membuat aplikasi klien di jquery dan memanggil kedua metode tersebut. Berikut adalah kode untuk index.html mengajukan. Itu index.html halaman mengirimkan permintaan ke server ketika tombol - Greet dan SayHellodiklik. Kami akan membuat permintaan asinkron menggunakan fungsi $ .ajax ().
<!DOCTYPE html>
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function() { $("#btnSayhello").click(function() {
const name = $("#txtName").val(); console.log(name); $("#SayhelloDiv").html('loading....');
$.ajax({url: "http://localhost:9000/graphql", contentType: "application/json",type:'POST', data: JSON.stringify({ query:`{ sayHello(name:"${name}")}`
}),
success: function(result) {
console.log(JSON.stringify(result))
$("#SayhelloDiv").html("<h1>"+result.data.sayHello +"</h1>"); } }); }); $("#btnGreet").click(function() {
$("#greetingDiv").html('loading....'); //https://kannan-first-graphql-app.herokuapp.com/graphql $.ajax({url: "http://localhost:9000/graphql",
contentType: "application/json",
type:'POST',
data: JSON.stringify({
query:`{greeting}`
}),
success: function(result) {
$("#greetingDiv").html("<h1>"+result.data.greeting+"</h1>");
}
});
});
});
</script>
</head>
<body>
<h1>Jquery Client </h1>
<hr/>
<section>
<button id = "btnGreet">Greet</button>
<br/> <br/>
<div id = "greetingDiv"> </div>
</section>
<br/> <br/> <br/>
<hr/>
<section>
Enter a name:<input id = "txtName" type = "text" value = "kannan"/>
<button id = "btnSayhello">SayHello</button>
<div id = "SayhelloDiv"> </div>
</section>
</body>
</html>
Buka file ini di browser dan klik tombol untuk melihat responsnya. Outputnya akan seperti yang diberikan di bawah ini -
React adalah pustaka Javascript untuk membangun antarmuka pengguna. Bab ini menjelaskan bagaimana seseorang dapat mengintegrasikan GraphQL dengan aplikasi React.
Ilustrasi
Cara tercepat untuk menyiapkan proyek react adalah dengan menggunakan alat Buat Aplikasi React . Di bagian selanjutnya, kita akan mempelajari cara mengatur Server dan Klien.
Menyiapkan Server
Untuk menyiapkan Server, ikuti langkah-langkah di bawah ini -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder react-server-app. Ubah direktori Anda menjadi react-server-app dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di folder proyek react-server-app dan tambahkan kode berikut -
type Query
{
greeting: String
sayHello(name:String!):String
}
File tersebut telah mendefinisikan dua kueri - salam dan sayHello. Kueri sayHello menerima parameter string dan mengembalikan string lain. Parameter ke fungsi sayHello () tidak null.
Langkah 3 - Buat Penyelesai
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const Query =
{
greeting: () => 'Hello GraphQL From TutorialsPoint !!' ,
sayHello:(root,args,context,info) => `Hi ${args.name} GraphQL server says Hello to you!!`
}
module.exports = {Query}
Di sini sapaan dan sayHello adalah dua pemecah masalah. Dalam resolver sayHello, nilai yang diteruskan ke parameter nama dapat diakses melalui args. Untuk mengakses fungsi resolver di luar modul, objek Query harus diekspor menggunakan module.exports.
Langkah 4 - Jalankan Aplikasi
Buat file server.js. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
greeting,
sayHello(name:"Mohtashim")
}
Tanggapan dari server diberikan di bawah ini -
{
"data": {
"greeting": "Hello GraphQL From TutorialsPoint !!",
"sayHello": "Hi Mohtashim GraphQL server says Hello to you!!"
}
}
Menyiapkan Klien
Buka terminal baru untuk klien. Terminal server harus tetap berjalan sebelum menjalankan aplikasi klien. Aplikasi React akan berjalan pada port number 3000 dan aplikasi server pada port number 9000.
Langkah 1 - Buat Proyek React hello-world-client
Di terminal klien, ketik perintah berikut -
npx create-react-app hello-world-client
Ini akan menginstal semua yang diperlukan untuk aplikasi react yang khas. Itunpx utilitas dan create-react-appalat membuat proyek dengan nama hello-world-client. Setelah instalasi selesai, buka proyek di VSCode.
Langkah 2 - Mulai hello-world-client
Ubah jalur folder saat ini di terminal ke hello-world-client. Ketik npm start untuk meluncurkan proyek. Ini akan menjalankan server pengembangan pada port 3000 dan secara otomatis akan membuka browser dan memuat halaman indeks.
Ini ditunjukkan pada gambar yang diberikan di bawah ini -
Langkah 3 - Ubah Komponen Aplikasi
Di App.js di dalam folder src, tambahkan dua fungsi, satu untuk memuat salam dan satu lagi untuk memuat pesan sayHello.
Berikut adalah fungsi loadGreeting yang mengirimkan kueri GraphQL untuk salam.
async function loadGreeting() {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:'{greeting}'})
})
const rsponseBody = await response.json();
return rsponseBody.data.greeting;
console.log("end of function")
}
Berikut ini adalah loadSayhello fungsi yang mengirimkan kueri GraphQL untuk sayHello -
async function loadSayhello(name) {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:`{sayHello(name:"${name}")}`})
})
}
Selesai App.js file ditampilkan di bawah -
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
async function loadGreeting() {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:'{greeting}'})
})
const rsponseBody = await response.json();
return rsponseBody.data.greeting;
console.log("end of function")
}
async function loadSayhello(name) {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:`{sayHello(name:"${name}")}`})
})
const rsponseBody = await response.json();
return rsponseBody.data.sayHello;
}
class App extends Component {
constructor(props) {
super(props);
this.state = {greetingMessage:'',sayHelloMessage:'',userName:''}
this.updateName = this.updateName.bind(this);
this.showSayHelloMessage = this.showSayHelloMessage.bind(this);
this.showGreeting = this.showGreeting.bind(this);
}
showGreeting() {
loadGreeting().then(g => this.setState({greetingMessage:g+" :-)"}))
}
showSayHelloMessage() {
const name = this.state.userName;
console.log(name)
loadSayhello(name).then(m => this.setState({sayHelloMessage:m}))
}
updateName(event) {
this.setState({userName:event.target.value})
}
render() {
return (
<div className = "App">
<header className = "App-header">
<img src = {logo} className = "App-logo" alt = "logo" />
<h1 className = "App-title">Welcome to React</h1>
</header>
<br/><br/>
<section>
<button id = "btnGreet" onClick = {this.showGreeting}>Greet</button>
<br/> <br/>
<div id = "greetingDiv">
<h1>{this.state.greetingMessage}</h1>
</div>
</section>
<hr/>
<section>
Enter a name:<input id = "txtName" type = "text" onChange = {this.updateName}
value = {this.state.userName}/>
<button id = "btnSayhello" onClick = {this.showSayHelloMessage}>SayHello</button>
<br/>
user name is:{this.state.userName} <br/>
<div id = "SayhelloDiv">
<h1>{this.state.sayHelloMessage}</h1>
</div>
</section>
</div>
);
}
}
export default App;
Setelah kedua aplikasi berjalan, klik tombol salam. Selanjutnya, masukkan nama di kotak teks dan klik tombol sayHello. Outputnya akan seperti yang diberikan di bawah ini -
Kami telah menggunakan Apollo Server untuk membangun spesifikasi graphql di sisi server. Cepat dan mudah untuk membangun server GraphQL yang siap produksi. Sekarang mari kita pahami sisi klien.
Apollo Client adalah cara terbaik menggunakan GraphQL untuk membangun aplikasi klien. Klien dirancang untuk membantu pengembang dengan cepat membangun UI yang mengambil data dengan GraphQL dan dapat digunakan dengan front-end JavaScript apa pun.
Apollo Client mendukung platform berikut -
Sr.No. | Platform & Kerangka |
---|---|
1 | Javascript Bereaksi, Sudut, Vue, Meteor, Ember |
2 | WebComponents Polimer, menyala-apollo |
3 | Native Mobile Android Asli dengan Java, iOS Asli dengan Swift |
Caching adalah salah satu fitur utama Apollo Client. apollo-boost adalah paket kemudahan yang membawa banyak dependensi lainnya.
Ilustrasi
Mari kita lihat bagaimana menggunakan Apollo Client untuk membangun aplikasi klien menggunakan langkah-langkah berikut -
Menyiapkan Server
Kami harus mengikuti langkah-langkah di bawah ini untuk menyiapkan server -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder apollo-server-app. Ubah direktori Anda menjadi apollo-server-app dari terminal. Kemudian, ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di folder proyek apollo-server-app dan tambahkan kode berikut -
type Query
{
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
college:College
}
type College {
id:ID!
name:String
location:String
rating:Float
}
Langkah 3 - Tambahkan Resolver
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
const db = require('./db')
const Query = {
//resolver function for students returns list
students:() => db.students.list(),
}
const Student = {
college:(root) => {
return db.colleges.get(root.collegeId);
}
}
module.exports = {Query,Student}
Langkah 4 - Jalankan Aplikasi
Membuat server.jsmengajukan. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami akan menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor.
{
students{
id
firstName
college{
name
}
}
}
Tanggapan untuk pertanyaan tersebut adalah seperti yang diberikan di bawah ini -
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim",
"college": {
"name": "CUSAT"
}
},
{
"id": "S1002",
"firstName": "Kannan",
"college": {
"name": "AMU"
}
},
{
"id": "S1003",
"firstName": "Kiran",
"college": {
"name": "AMU"
}
}
]
}
}
Menyiapkan Klien
Buka terminal baru untuk klien. Terminal server harus tetap berjalan sebelum menjalankan aplikasi klien. Aplikasi React akan berjalan pada port number 3000 dan aplikasi server pada port number 9000.
Langkah 1 - Buat Aplikasi React
Di terminal klien, ketik perintah berikut -
npx create-react-app hello-world-client
Ini akan menginstal semua yang diperlukan untuk aplikasi react yang khas. Utilitas npx dan alat create-react-app membuat proyek dengan namahello-world-client. Setelah instalasi selesai, buka proyek di VSCode.
Langkah 2 - Mulai hello-world-client
Ubah jalur folder saat ini di terminal menjadi hello-world-client. Ketik npm start untuk meluncurkan proyek. Ini akan menjalankan server pengembangan pada port 3000 dan secara otomatis akan membuka browser dan memuat halaman indeks.
Ini ditunjukkan pada gambar yang diberikan di bawah ini -
Langkah 3 - Instal Perpustakaan Klien Apollo
Untuk menginstal Klien Apollo, buka terminal baru dan berada di jalur folder proyek saat ini. Ketik perintah berikut -
npm install apollo-boost graphql
Ini akan mengunduh pustaka graphql untuk sisi klien dan juga paket Apollo Boost. Kita dapat memeriksa silang ini dengan mengetikkan tampilan npm di dependensi apollo-boost. Ini akan memiliki banyak dependensi seperti yang ditunjukkan di bawah ini -
{
'apollo-cache': '^1.1.15',
'apollo-cache-inmemory': '^1.2.8',
'apollo-client': '^2.4.0',
'apollo-link': '^1.0.6',
'apollo-link-error': '^1.0.3',
'apollo-link-http': '^1.3.1',
'apollo-link-state': '^0.4.0',
'graphql-tag': '^2.4.2'
}
Kami dapat dengan jelas melihat bahwa perpustakaan Apollo-Client diinstal.
Langkah 4 - Ubah Komponen Aplikasi di File index.js
Dengan Apollo Client, kita bisa langsung memanggil server tanpa menggunakan fetch API. Selain itu, kueri dan mutasi tidak boleh disematkan dalam string yang dibuat dengan notasi centang belakang. Ini karena,gqlfungsi secara langsung mem-parsing kueri. Artinya, seorang programmer bisa langsung menulis query dengan cara yang sama saat menulis query di tool GraphiQL. gql adalah fungsi tag yang akan mengurai string template yang ditulis dalam notasi centang kembali ke objek kueri graphql. Metode kueri Apollo Client mengembalikan sebuah janji.
Potongan kode berikut menunjukkan cara mengimpor Klien Apollo -
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
const endPointUrl = 'http://localhost:9000/graphql'
const client = new ApolloClient({
link: new HttpLink({uri:endPointUrl}),
cache:new InMemoryCache()
});
Di bab sebelumnya, kita membahas cara menggunakan fetch API untuk permintaan HTTP. Kode berikut menunjukkan cara menggunakangqlfungsi. ItuloadStudentsAsync Fungsi menggunakan klien graphql untuk menanyakan server.
async function loadStudentsAsync() {
const query = gql`
{
students{
id
firstName
lastName
college{
name
}
}
}`
const {data} = await client.query({query}) ;
return data.students;
}
Anda hanya perlu menyimpan file index.js di srcfolder dan index.html di folder publik; semua file lain yang dibuat secara otomatis dapat dihapus.
Struktur direktori diberikan di bawah ini -
hello-world-client /
-->node_modules
-->public
index.html
-->src
index.js
-->package.json
Berikut ini adalah index.js dalam aplikasi reaksi -
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
// apollo client
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
import gql from 'graphql-tag'
const endPointUrl = 'http://localhost:9000/graphql'
const client = new ApolloClient({
link: new HttpLink({uri:endPointUrl}),
cache:new InMemoryCache()
});
async function loadStudentsAsync() {
const query = gql`
{
students{
id
firstName
lastName
college{
name
}
}
}
`
const {data} = await client.query({query}) ;
return data.students;
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
students:[]
}
this.studentTemplate = [];
}
async loadStudents() {
const studentData = await loadStudentsAsync();
this.setState({
students: studentData
})
console.log("loadStudents")
}
render() {
return(
<div>
<input type = "button" value = "loadStudents" onClick = {this.loadStudents.bind(this)}/>
<div>
<br/>
<hr/>
<table border = "3">
<thead>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>college Name</td>
</tr>
</thead>
<tbody>
{
this.state.students.map(s => {
return (
<tr key = {s.id}>
<td>
{s.firstName}
</td>
<td>
{s.lastName}
</td>
<td>
{s.college.name}
</td>
</tr>
)
})
}
</tbody>
</table>
</div>
</div>
)
}
}
ReactDOM.render(<App/>, document.getElementById('root'));
Aplikasi react akan memuat siswa dari server GraphQL, setelah kita mengklik tombol loadStudents seperti yang ditunjukkan di bawah ini -
Otentikasi adalah proses atau tindakan memverifikasi identitas pengguna atau proses. Aplikasi harus mengautentikasi pengguna untuk memastikan bahwa data tidak tersedia untuk pengguna anonim. Di bagian ini, kita akan mempelajari cara mengotentikasi klien GraphQL.
JWT Ekspres
Dalam contoh ini, kami akan menggunakan jQuery untuk membuat aplikasi klien. Untuk mengotentikasi permintaan, kami akan menggunakan express-jwt modul di sisi server.
Modul express-jwt adalah middleware yang memungkinkan Anda mengautentikasi permintaan HTTP menggunakan token JWT. JSON Web Token (JWT) adalah string panjang yang mengidentifikasi pengguna yang masuk.
Setelah pengguna berhasil masuk, server menghasilkan token JWT. Token ini dengan jelas mengidentifikasi log. Dengan kata lain, token merupakan representasi dari identitas pengguna. Jadi lain kali, ketika klien datang ke server, ia harus menunjukkan token ini untuk mendapatkan sumber daya yang diperlukan. Klien dapat berupa aplikasi seluler atau aplikasi web.
Ilustrasi
Kami akan mengikuti prosedur langkah-bijaksana untuk memahami ilustrasi ini.
Menyiapkan Server
Berikut adalah langkah-langkah untuk menyiapkan server -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder auth-server-app. Ubah direktori Anda menjadi auth-server-app dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
schema.graphql auth-server-apptype Query
{
greetingWithAuth:String
}
Langkah 3 - Tambahkan Resolver
Buat file resolvers.js di folder proyek dan tambahkan kode berikut -
Penyelesai akan memverifikasi apakah objek pengguna yang diautentikasi tersedia dalam objek konteks GraphQL. Ini akan memunculkan pengecualian jika pengguna yang diautentikasi tidak tersedia.
const db = require('./db')
const Query = {
greetingWithAuth:(root,args,context,info) => {
//check if the context.user is null
if (!context.user) {
throw new Error('Unauthorized');
}
return "Hello from TutorialsPoint, welcome back : "+context.user.firstName;
}
}
module.exports = {Query}
Langkah 4 - Buat File Server.js
Middleware otentikasi mengotentikasi pemanggil menggunakan JSON Web Token. URL untuk otentikasi adalah http://localhost:9000/login.
Ini adalah operasi pasca. Pengguna harus mengirimkan email dan kata sandinya yang akan divalidasi dari backend. Jika token yang valid dibuat menggunakan metode jwt.sign, klien harus mengirimkan ini di header untuk permintaan selanjutnya.
Jika tokennya valid, req.user akan disetel dengan objek JSON yang didekodekan untuk digunakan oleh middleware selanjutnya untuk otorisasi dan kontrol akses.
Kode berikut menggunakan dua modul - jsonwebtoken dan express-jwt untuk mengautentikasi permintaan -
Saat pengguna mengklik file greettombol, permintaan untuk rute / graphql dikeluarkan. Jika pengguna tidak diautentikasi, dia akan diminta untuk mengautentikasi dirinya sendiri.
Pengguna diberikan formulir yang menerima id email dan kata sandi. Dalam contoh kami, / login route bertanggung jawab untuk mengautentikasi pengguna.
Rute / login memverifikasi jika ditemukan kecocokan dalam database untuk kredensial yang diberikan oleh pengguna.
Jika kredensial tidak valid, pengecualian HTTP 401 dikembalikan kepada pengguna.
Jika kredensial valid, token dibuat oleh server. Token ini dikirim sebagai bagian dari tanggapan kepada pengguna. Ini dilakukan oleh fungsi jwt.sign.
const expressJwt = require('express-jwt');
const jwt = require('jsonwebtoken');
//private key
const jwtSecret = Buffer.from('Zn8Q5tyZ/G1MHltc4F/gTkVJMlrbKiZt', 'base64');
app.post('/login', (req, res) => {
const {email, password} = req.body;
//check database
const user = db.students.list().find((user) => user.email === email);
if (!(user && user.password === password)) {
res.sendStatus(401);
return;
}
//generate a token based on private key, token doesn't have an expiry
const token = jwt.sign({sub: user.id}, jwtSecret);
res.send({token});
});
Untuk setiap permintaan, fungsi app.use () akan dipanggil. Ini pada gilirannya akan memanggil middleware expressJWT. Middleware ini akan memecahkan kode JSON Web Token. ID pengguna yang disimpan dalam token akan diambil dan disimpan sebagai pengguna properti di objek permintaan.
//decodes the JWT and stores in request object
app.use(expressJwt({
secret: jwtSecret,
credentialsRequired: false
}));
Untuk menyediakan properti pengguna dalam konteks GraphQL, properti ini ditugaskan ke file context objek seperti yang ditunjukkan di bawah ini -
//Make req.user available to GraphQL context
app.use('/graphql', graphqlExpress((req) => ({
schema,
context: {user: req.user &&apm; db.students.get(req.user.sub)}
})));
Membuat server.js di jalur folder saat ini. File server.js lengkap adalah sebagai berikut -
const bodyParser = require('body-parser');
const cors = require('cors');
const express = require('express');
const expressJwt = require('express-jwt'); //auth
const jwt = require('jsonwebtoken'); //auth
const db = require('./db');
var port = process.env.PORT || 9000
const jwtSecret = Buffer.from('Zn8Q5tyZ/G1MHltc4F/gTkVJMlrbKiZt', 'base64');
const app = express();
const fs = require('fs')
const typeDefs = fs.readFileSync('./schema.graphql',{encoding:'utf-8'})
const resolvers = require('./resolvers')
const {makeExecutableSchema} = require('graphql-tools')
const schema = makeExecutableSchema({typeDefs, resolvers})
app.use(cors(), bodyParser.json(), expressJwt({
secret: jwtSecret,
credentialsRequired: false
}));
const {graphiqlExpress,graphqlExpress} = require('apollo-server-express')
app.use('/graphql', graphqlExpress((req) => ({
schema,
context: {user: req.user && db.students.get(req.user.sub)}
})));
app.use('/graphiql',graphiqlExpress({endpointURL:'/graphql'}))
//authenticate students
app.post('/login', (req, res) => {
const email = req.body.email;
const password = req.body.password;
const user = db.students.list().find((user) => user.email === email);
if (!(user && user.password === password)) {
res.sendStatus(401);
return;
}
const token = jwt.sign({sub: user.id}, jwtSecret);
res.send({token});
});
app.listen(port, () => console.info(`Server started on port ${port}`));
Langkah 5 - Jalankan Aplikasi
Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan ketik URL-nya http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
greetingWithAuth
}
Dalam respons di bawah ini, kami mendapat kesalahan karena kami bukan pengguna yang diautentikasi.
{
"data": {
"greetingWithAuth": null
},
"errors": [
{
"message": "Unauthorized",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"greetingWithAuth"
]
}
]
}
Di bagian selanjutnya, mari kita buat aplikasi klien untuk mengautentikasi.
Menyiapkan Klien JQuery
Dalam aplikasi klien, tombol salam disediakan yang akan memanggil skema greetingWithAuth. Jika Anda mengklik tombol tanpa login, itu akan memberi Anda pesan kesalahan seperti di bawah ini -
Setelah Anda masuk dengan pengguna yang tersedia di database, layar berikut akan muncul -
Untuk mengakses greeting, kita perlu mengakses URL terlebih dahulu http://localhost:9000/login rute seperti di bawah ini.
Responsnya akan berisi token yang dihasilkan dari server.
$.ajax({
url:"http://localhost:9000/login",
contentType:"application/json",
type:"POST",
data:JSON.stringify({email,password}),
success:function(response) {
loginToken = response.token;
$('#authStatus') .html("authenticated successfully") .css({"color":"green",'font-weight':'bold'}); $("#greetingDiv").html('').css({'color':''});
},
error:(xhr,err) => alert('error')
})
Setelah berhasil login, kita dapat mengakses greetingWithAuth skema seperti yang diberikan di bawah ini. Harus ada Authorizationheader untuk semua permintaan berikutnya dengan token pembawa.
{
url: "http://localhost:9000/graphql",
contentType: "application/json",
headers: {"Authorization": 'bearer '+loginToken}, type:'POST',
data: JSON.stringify({
query:`{greetingWithAuth}`
}
Berikut ini adalah kode untuk index.html -
<!DOCTYPE html>
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function() { let loginToken = ""; $("#btnGreet").click(function() {
$.ajax({url: "http://localhost:9000/graphql", contentType: "application/json", headers: {"Authorization": 'bearer '+loginToken}, type:'POST', data: JSON.stringify({ query:`{greetingWithAuth}` }), success: function(result) { $("#greetingDiv").html("<h1>"+result.data.greetingWithAuth+"</h1>")
},
error:function(jQxhr,error) {
if(jQxhr.status == 401) {
$("#greetingDiv").html('please authenticate first!!') .css({"color":"red",'font-weight':'bold'}) return; } $("#greetingDiv").html('error').css("color","red");
}
});
});
$('#btnAuthenticate').click(function() { var email = $("#txtEmail").val();
var password = $("#txtPwd").val(); if(email && password) { $.ajax({
url:"http://localhost:9000/login",
contentType:"application/json",
type:"POST",
data:JSON.stringify({email,password}),
success:function(response) {
loginToken = response.token;
$('#authStatus') .html("authenticated successfully") .css({"color":"green",'font-weight':'bold'}); $("#greetingDiv").html('').css({'color':''});
},
error:(xhr,err) => alert('error')
})
}else alert("email and pwd empty")
})
});
</script>
</head>
<body>
<h1> GraphQL Authentication </h1>
<hr/>
<section>
<button id = "btnGreet">Greet</button>
<br/> <br/>
<div id = "greetingDiv"></div>
</section>
<br/> <br/> <br/>
<hr/>
<section id = "LoginSection">
<header>
<h2>*Login first to access greeting </h2>
</header>
<input type = "text" value = "[email protected]" placeholder = "enter email" id = "txtEmail"/>
<br/>
<input type = "password" value = "pass123" placeholder = "enter password" id = "txtPwd"/>
<br/>
<input type = "button" id = "btnAuthenticate" value = "Login"/>
<p id = "authStatus"></p>
</section>
</body>
</html>
Caching adalah proses menyimpan data di tempat penyimpanan sementara yang disebut cache. Saat Anda kembali ke halaman yang baru-baru ini Anda kunjungi, browser bisa mendapatkan file-file tersebut dari cache daripada server asli. Ini menghemat waktu Anda, dan jaringan dari beban lalu lintas tambahan.
Aplikasi klien yang berinteraksi dengan GraphQL bertanggung jawab untuk menyimpan data di ujungnya. Salah satu pola yang mungkin untuk ini adalah memesan bidang, seperti id, menjadi pengenal unik global.
Cache InMemory
InMemoryCache adalah penyimpanan data yang dinormalisasi yang biasa digunakan dalam aplikasi klien GraphQL tanpa menggunakan pustaka lain seperti Redux.
Kode contoh untuk menggunakan InMemoryCache dengan ApolloClient diberikan di bawah ini -
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
const cache = new InMemoryCache();
const client = new ApolloClient({
link: new HttpLink(),
cache
});
Konstruktor InMemoryCache mengambil objek config opsional dengan properti untuk menyesuaikan cache Anda.
Sr.No. | Parameter & Deskripsi |
---|---|
1 | addTypename Boolean untuk menentukan apakah akan menambahkan __typename ke dokumen (default: true) |
2 | dataIdFromObject Fungsi yang mengambil objek data dan mengembalikan pengenal unik untuk digunakan saat menormalkan data di penyimpanan |
3 | fragmentMatcher Secara default, InMemoryCache menggunakan pencocokan fragmen heuristik |
4 | cacheRedirects Peta fungsi untuk mengarahkan kueri ke entri lain di cache sebelum permintaan dilakukan. |
Ilustrasi
Kami akan membuat aplikasi satu halaman di ReactJS dengan dua tab - satu untuk tab beranda dan satu lagi untuk siswa. Tab siswa akan memuat data dari API server GraphQL. Aplikasi akan meminta data siswa ketika pengguna menavigasi dari tab beranda ke tab siswa. Data yang dihasilkan akan di-cache oleh aplikasi.
Kami juga akan menanyakan waktu server menggunakan getTimebidang untuk memverifikasi apakah halaman tersebut di-cache. Jika data dikembalikan dari cache, halaman akan menampilkan waktu permintaan pertama dikirim ke server. Jika data adalah hasil dari permintaan baru yang dibuat ke server, itu akan selalu menampilkan waktu terbaru dari server.
Menyiapkan Server
Berikut adalah langkah-langkah untuk menyiapkan server -
Langkah 1 - Unduh dan Instal Dependensi yang Diperlukan untuk Proyek
Buat folder cache-server-app. Ubah direktori Anda menjadi cache-server-app dari terminal. Ikuti langkah 3 hingga 5 yang dijelaskan di bab Pengaturan Lingkungan.
Langkah 2 - Buat Skema
Menambahkan schema.graphql file di folder proyek cache-server-app dan tambahkan kode berikut -
type Query {
students:[Student]
getTime:String
}
type Student {
id:ID!
firstName:String
lastName:String
fullName:String
}
Langkah 3 - Tambahkan Resolver
Buat file resolvers.js di folder proyek, dan tambahkan kode berikut -
const db = require('./db')
const Query = {
students:() => db.students.list(),
getTime:() => {
const today = new Date();
var h = today.getHours();
var m = today.getMinutes();
var s = today.getSeconds();
return `${h}:${m}:${s}`;
}
}
module.exports = {Query}
Langkah 4 - Jalankan Aplikasi
Buat file server.js. Lihat langkah 8 di Bab Pengaturan Lingkungan. Jalankan perintah npm start di terminal. Server akan aktif dan berjalan pada 9000 port. Di sini, kami akan menggunakan GraphiQL sebagai klien untuk menguji aplikasi.
Buka browser dan masukkan URL http://localhost:9000/graphiql. Ketik kueri berikut di editor -
{
getTime
students {
id
firstName
}
}
Respon sampel menunjukkan nama siswa dan waktu server.
{
"data": {
"getTime": "22:18:42",
"students": [
{
"id": "S1001",
"firstName": "Mohtashim"
},
{
"id": "S1002",
"firstName": "Kannan"
},
{
"id": "S1003",
"firstName": "Kiran"
}
]
}
}
Menyiapkan Klien ReactJS
Buka terminal baru untuk klien. Terminal server harus tetap berjalan sebelum menjalankan aplikasi klien. Aplikasi React akan berjalan pada port number 3000 dan aplikasi server pada port number 9000.
Langkah 1 - Buat Aplikasi React
Di terminal klien, ketik perintah berikut -
npx create-react-app hello-world-client
Ini akan menginstal semua yang diperlukan untuk aplikasi react yang khas. Itunpx utility dan create-react-appalat membuat proyek dengan nama hello-world-client. Setelah instalasi selesai, buka proyek di VSCode.
Instal modul router untuk bereaksi menggunakan perintah berikut - npm install react-router-dom.
Langkah 2 - Mulai hello-world-client
Ubah jalur folder saat ini di terminal ke hello-world-client. Ketik npm start untuk meluncurkan proyek. Ini akan menjalankan server pengembangan pada port 3000 dan secara otomatis akan membuka browser dan memuat halaman indeks.
Ini ditunjukkan pada gambar yang diberikan di bawah ini -
Langkah 3 - Instal Perpustakaan Klien Apollo
Untuk menginstal Klien Apollo, buka terminal baru dan berada di jalur folder proyek saat ini. Ketik perintah berikut -
npm install apollo-boost graphql
Ini akan mengunduh pustaka graphql untuk sisi klien dan juga paket Apollo Boost. Kita dapat memverifikasi silang ini dengan mengetikkan npm view apollo-boost dependencies. Ini akan memiliki banyak dependensi seperti yang ditunjukkan di bawah ini -
{
'apollo-cache': '^1.1.15',
'apollo-cache-inmemory': '^1.2.8',
'apollo-client': '^2.4.0',
'apollo-link': '^1.0.6',
'apollo-link-error': '^1.0.3',
'apollo-link-http': '^1.3.1',
'apollo-link-state': '^0.4.0',
'graphql-tag': '^2.4.2'
}
Kami dapat dengan jelas melihat bahwa pustaka apollo-client diinstal.
Langkah 4 - Ubah Komponen Aplikasi di File index.js
Untuk aplikasi react sederhana, Anda hanya perlu menyimpan index.js di src folder dan index.htmldi folder publik; semua file lain yang dibuat secara otomatis dapat dihapus.
Struktur direktori diberikan di bawah ini -
hello-world-client /
-->node_modules
-->public
index.html
-->src
index.js
students.js
-->package.json
Tambahkan file tambahan students.js yang akan berisi Komponen Siswa. Detail siswa diambil melalui Komponen Siswa. Di Komponen Aplikasi, kami menggunakan HashRouter.
Berikut ini adalah index.js dalam aplikasi reaksi -
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import {HashRouter, Route, Link} from 'react-router-dom'
//components
import Students from './students'
class App extends Component {
render() {
return(
<div><h1>Home !!</h1>
<h2>Welcome to React Application !! </h2>
</div>
)
}
}
function getTime() {
var d = new Date();
return d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()
}
const routes = <HashRouter>
<div>
<h4>Time from react app:{getTime()}</h4>
<header>
<h1> <Link to="/">Home</Link>
<Link to = "/students">Students</Link> </h1>
</header>
<Route exact path = "/students" component = {Students}></Route>
<Route exact path = "/" component = {App}></Route>
</div>
</HashRouter>
ReactDOM.render(routes, document.querySelector("#root"))
Langkah 5 - Edit Siswa Komponen di Students.js
Dalam Komponen Siswa, kami akan menggunakan dua pendekatan berikut untuk memuat data -
Fetch API (loadStudents_noCache) - Ini akan memicu permintaan baru setiap kali klik pada tab siswa.
Apollo Client (loadWithApolloclient) - Ini akan mengambil data dari cache.
Tambahkan fungsi loadWithApolloclientkueri mana untuk siswa dan waktu dari server. Fungsi ini akan mengaktifkan caching. Di sini kami menggunakan fungsi gql untuk mengurai kueri.
async loadWithApolloclient() {
const query = gql`{
getTime
students {
id
firstName
}
}`;
const {data} = await client.query({query})
return data;
}
Itu Fetch APIadalah antarmuka sederhana untuk mengambil sumber daya. Pengambilan memudahkan untuk membuat permintaan web dan menangani tanggapan daripada dengan XMLHttpRequest yang lebih lama. Metode berikut menunjukkan memuat data secara langsung menggunakan fetch api -
async loadStudents_noCache() {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:`{
getTime
students {
id
firstName
}
}`})
})
const rsponseBody = await response.json();
return rsponseBody.data;
}
Dalam konstruktor StudentsComponent, panggil loadWithApolloClientmetode. Selesai Student.js file di bawah -
import React, {Component} from 'react';
import { Link} from 'react-router-dom'
//Apollo Client
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
import gql from 'graphql-tag'
const client = new ApolloClient({
link: new HttpLink({uri:`http://localhost:9000/graphql`}),
cache:new InMemoryCache()
})
class Students extends Component {
constructor(props) {
super(props);
this.state = {
students:[{id:1,firstName:'test'}],
serverTime:''
}
this.loadWithApolloclient().then(data => {
this.setState({
students:data.students,
serverTime:data.getTime
})
})
}
async loadStudents_noCache() {
const response = await fetch('http://localhost:9000/graphql', {
method:'POST',
headers:{'content-type':'application/json'},
body:JSON.stringify({query:`{
getTime
students {
id
firstName
}
}`})
})
const rsponseBody = await response.json();
return rsponseBody.data;
}
async loadWithApolloclient() {
console.log("inside apollo client function")
const query = gql`{
getTime
students {
id
firstName
}
}`;
const {data} = await client.query({query})
return data;
}
render() {
return(
<div>
<h3>Time from GraphQL server :{this.state.serverTime}</h3>
<p>Following Students Found </p>
<div>
<ul>
{
this.state.students.map(s => {
return(
<li key = {s.id}>
{s.firstName}
</li>
)
})
}
</ul>
</div>
</div>
)
}
}
export default Students
Langkah 6 - Jalankan Aplikasi React dengan npm start
Anda dapat menguji aplikasi react dengan beralih dari tab beranda ke tab siswa. Setelah tab siswa dimuat dengan data dari server. Ini akan menyimpan data ke dalam cache. Anda dapat mengujinya dengan beralih dari rumah ke tab siswa beberapa kali. Outputnya akan seperti yang ditunjukkan di bawah ini -
Jika Anda telah memuat halaman siswa terlebih dahulu dengan mengetik URL, http://localhost:3000/#/students, Anda dapat melihat bahwa waktu buka untuk aplikasi react dan GraphQL akan kurang lebih sama. Setelah itu jika Anda beralih ke tampilan beranda dan kembali ke server GraphQL, waktu tidak akan berubah. Ini menunjukkan bahwa data di-cache.
Langkah 7 - Ubah Panggilan loadWithApolloclient ke loadStudents_noCache
Jika Anda mengubah metode muat menjadi loadStudents_noCachedalam konstruktor StudentComponent, output tidak akan menyimpan data dalam cache. Ini menunjukkan perbedaan antara caching dan non-caching.
this.loadStudents_noCache().then(data => {
this.setState({
students:data.students,
serverTime:data.getTime
})
})
Dari output di atas, terlihat jelas bahwa jika Anda beralih antar tab, waktu dari server graphql akan selalu terbaru yang berarti data tidak di-cache.