Senarai Kandungan

Kelebihan menggunakan GraphQL berbanding API REST

Salah satu masalah yang paling biasa dengan REST ialah lebih dan di bawah pengambilan data. Ini berlaku kerana satu-satunya cara untuk pelanggan memuat turun data adalah dengan menekan titik akhir yang mengembalikan struktur data tetap. Sukar untuk mereka bentuk API supaya ia dapat menyediakan pelanggan dengan keperluan data yang tepat.

  • GraphQL mengurangkan permintaan rangkaian dengan membenarkan kami mengambil atau mengambil semua data yang kami perlukan dalam satu pertanyaan.
  • Dengan GraphQL, tidak perlu versi kerana kami boleh menambah medan dan jenis baru dengan mudah ke API GraphQL kami tanpa menjejaskan pertanyaan sedia ada. Juga, kita boleh menandakan medan dengan mudah sebagai ditamatkan, dan medan akan dikecualikan daripada respons yang diterima daripada pelayan.
  • Dengan GraphQL, anda juga boleh melakukan pemantauan prestasi tahap rendah terhadap permintaan yang diproses oleh pelayan anda. GraphQL menggunakan konsep fungsi penyelesai untuk mengumpul data yang diminta oleh klien. Instrumen dan mengukur prestasi penyelesai ini memberikan pandangan penting mengenai kesesakan dalam sistem anda.

Penjelasan Ringkas Bagaimana GraphQL berfungsi

Pelaksanaan GraphQL terutamanya mengandungi tiga bahagian

  • Skema - Menerangkan data.
  • Penyelesai - Logik untuk mengambil data dari sumber yang berbeza (perkhidmatan mikro).
  • Pertanyaan - Klien meminta data yang akan diambil.

Skema (Maklumat lanjut tentang skema dan jenis)

➡️
type Query{getUsers:[User]getUser(user_id:Int!):User}type Mutation{addUser(first_name:String!,last_name:String,pic:String):Boolean deleteUser(user_id:Int!):Boolean}type User{first_name:Stringlast_name:Stringpic:Stringfull_name:Stringuser_id:Int!designation:String}

Kod di atas menerangkan perkara yang boleh dikueri dan data respons (jenis data) yang dijangkakan daripada sumber.

P.S: "!" bermaksud bahawa medan tidak boleh terbatal atau tidak ditentukan.

Penyelesai (Kod di bawah ditulis dalam NodeJs)

➡️
{Query:{getUsers:(obj,args,context,info) => { return users},getUser:(obj,{user_id},context,info) => { return users.find(user => user.user_id == user_id) } },Mutation:{ addUser:(obj,{first_name,last_name,pic},context,info) => { users.push({ first_name:first_name, last_name:last_name, pic:pic }) return true },deleteUser:(obj,{user_id},context,info) => { for (var i = 0; i < users.length; i++) { if(users[i].user_id == user_id){ users.splice(i,1) return true }}return false } }, User:{ full_name:(prev_obj,args,context,info) => { return `${prev_obj.first_name} ${prev_obj.last_name}`}}}

Kod di atas menerangkan logik yang dilaksanakan apabila permintaan pelanggan.

P.S. Saya telah menggunakan fungsi penyelesai full_name untuk jenis Pengguna untuk menulis logik saya sendiri.

Pertanyaan (Maklumat lanjut tentang pertanyaan)

➡️
{getUsers{full_name pic}}

Pertanyaan pelanggan THe menggunakan kod di atas yang mengembalikan hanya full_name dan gambar seperti di bawah.

Klien P.S. hanya boleh bertanya untuk medan yang ditakrifkan dalam Schema.

➡️
{"data":{"getUsers":{"full_name":"Srinivasa Sainath", "pic":"https://vpms.xoxoday.com/images/xoxoday.png"}}}

Permintaan klien boleh terdiri daripada Pertanyaan dan Mutasi ( dan Langganan. Ini akan dibincangkan dalam blog masa depan siri GraphQL).

Kedua-dua permintaan melakukan perkara yang sama. Kecuali mutasi itu dilaksanakan secara serentak. Konvensyen yang diikuti adalah Mutasi digunakan untuk sebarang operasi yang menyebabkan menulis dalam pelayan ( profil kemas kini, membuat pesanan dll) dan pertanyaan digunakan untuk mengambil data (dapatkan menu, dapatkan senarai baucar, dll.). ( Sama seperti GET dan POST ). Secara teknikal kedua-dua jenis permintaan ini boleh digunakan untuk melaksanakan sebarang logik. Tetapi lebih baik mengikuti konvensyen kerana ia membantu pasukan anda.

Perkara Penting untuk perhubungan pemahaman antara fungsi penyelesai dan pertanyaan

  • Anda boleh memikirkan setiap medan dalam pertanyaan GraphQL sebagai fungsi atau kaedah jenis terdahulu yang mengembalikan jenis berikut. Ini adalah tepat bagaimana GraphQL berfungsi. Setiap medan pada setiap jenis disokong oleh fungsi yang dipanggil penyelesai, yang disediakan oleh pemaju pelayan GraphQL. Penyelesai yang sepadan dipanggil untuk menghasilkan nilai seterusnya apabila medan dilaksanakan.
  • Pelaksanaan selesai jika medan menghasilkan nilai skalar seperti rentetan atau nombor. Walau bagaimanapun, jika medan mempunyai nilai objek, pertanyaan akan mengandungi pilihan medan lain yang digunakan pada objek tersebut. Ini berterusan sehingga nilai skalar dicapai. Pertanyaan GraphQL sentiasa berakhir pada nilai skalar.

Fungsi penyelesai menerima empat argumen

Sintaks:

➡️
{getUsers:(obj,args,context,info) =>{ return users }}
  • OBJ Objek sebelumnya, yang untuk medan pada jenis Pertanyaan akar sering tidak digunakan.
    Untuk memahami, lebih lanjut mengenai hujah ini merujuk kepada Pelayan GraphQL Dengan Nod.js.
  • ARGS Argumen yang diberikan kepada medan dalam pertanyaan GraphQL. Dalam fungsi penyelesai di atas {user_input} ialah args
  • Konteks Nilai yang diberikan kepada setiap penyelesai dan menyimpan maklumat kontekstual penting seperti pengguna yang sedang log masuk, atau akses ke pangkalan data. Dalam penyelesai di atas, konteks fungsi digunakan untuk lulus token_info
  • Maklumat Nilai yang menyimpan maklumat khusus medan yang berkaitan dengan pertanyaan semasa serta butiran skema. Selalunya tidak digunakan
➡️
Clone the demo GraphQL project from here.P.S. In the next part of the GraphQL series, I will discuss how to implement GraphQL as an API Gateway.
Srinivasa Sainath

Srinivasa Sainath