GraphQL berbanding REST
Fahami bila GraphQL lebih baik daripada REST dan sebabnya.
GraphQL berbanding REST ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Mengapa GraphQL?
Anda sudah tahu cara menyediakan API REST dalam PHP. GraphQL bukan pengganti HTTP atau penyelesaian ajaib — ia ialah bahasa pertanyaan dan sistem jenis yang membolehkan klien menerangkan perkara yang diperlukan dengan tepat, lalu menerima tepat perkara itu dalam satu perjalanan pergi balik.
Dalam pelajaran ini, kami membandingkan kedua-duanya secara jujur: keadaan GraphQL benar-benar lebih baik, keadaan REST masih merupakan pilihan yang tepat, dan kos operasi GraphQL.
Pengambilan Berlebihan dan Pengambilan Tidak Mencukupi
Titik kesakitan REST yang lazim:
- Pengambilan berlebihan:
GET /users/1memulangkan 40 medan sedangkan antara muka pengguna hanya memerlukan 3. - Pengambilan tidak mencukupi: untuk memaparkan kiriman pengguna dan bilangan komen bagi setiap kiriman, anda memanggil
/users/1, kemudian/users/1/posts, kemudian N titik akhir komen.
GraphQL menyatukan semua ini menjadi satu permintaan deklaratif.
query {
user(id: 1) {
name
posts {
title
commentCount
}
}
}Satu Titik Akhir, Skema Berjenis
REST mendedahkan banyak URL; GraphQL mendedahkan satu titik akhir (biasanya POST /graphql) yang disokong oleh skema berjenis kuat. Skema itu ialah kontrak — strukturnya boleh diperiksa, jadi alat pembangunan (pelengkapan automatik, dokumentasi, penjanaan kod) tersedia secara langsung.
Di bawah ialah skema minimum dalam SDL. Bentuk setiap respons yang mungkin sudah diketahui dari awal.
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
commentCount: Int!
}
type Query {
user(id: ID!): User
}Respons Mencerminkan Pertanyaan
Satu sifat penting: bentuk respons JSON boleh dijangka berdasarkan pertanyaan. Klien tidak perlu meneka nama medan. Hal ini menghapuskan banyak perubahan versi yang mengganggu — anda boleh menambah medan tanpa merosakkan klien lama, dan menandai medan sebagai tidak digunakan dengan @deprecated, bukannya memotong URL /v2.
{
"data": {
"user": {
"name": "Ada",
"posts": [
{ "title": "On Engines", "commentCount": 12 }
]
}
}
}Kelebihan GraphQL Berbanding REST
GraphQL ialah pilihan yang lebih baik apabila:
- Anda melayani pelbagai klien beraneka jenis (web, iOS, Android) dengan keperluan data yang berbeza.
- Data itu ialah sebuah graf dengan hubungan mendalam yang dilalui klien secara dinamik.
- Anda mahu menggabungkan beberapa bahagian belakang di sebalik satu get laluan berjenis.
- Lelaran bahagian hadapan yang pantas penting dan anda mahu mengelakkan perubahan titik akhir bahagian belakang yang tidak berkesudahan.
Apabila REST Masih Unggul
Jangan terus memilih GraphQL secara automatik. REST lebih ringkas dan selalunya lebih baik apabila:
- Anda memerlukan penyimpanan cache HTTP — cache CDN/pinggir menggunakan URL dan kata kerja sebagai kunci; satu
POST /graphqltidak dapat difahami olehnya. - API berorientasikan sumber dan stabil (operasi cipta, baca, kemas kini dan padam pada beberapa entiti).
- Anda bergantung pada muat naik/muat turun fail atau penstriman, yang mana berbilang bahagian dan julat bait merupakan ciri asas dalam REST.
- Pengguna API anda ialah pihak ketiga yang menjangkakan semantik REST konvensional.
Perbandingan Ringkas PHP
Berikut ialah data yang sama yang dihimpunkan mengikut cara REST dalam PHP — perhatikan bahawa klien masih memerlukan beberapa panggilan atau anda perlu membina parameter pembenaman secara manual. GraphQL sebaliknya memindahkan logik pemilihan itu kepada klien.
<?php
// REST: server decides the payload shape
function userResource(int $id): array {
return [
'id' => $id,
'name' => 'Ada',
'email' => 'ada@example.com', // over-fetched by mobile
'createdAt' => '1815-12-10',
'posts' => [ // pre-embedded, all-or-nothing
['title' => 'On Engines', 'commentCount' => 12],
],
];
}
header('Content-Type: application/json');
echo json_encode(userResource(1), JSON_PRETTY_PRINT);
Kos Tambahan GraphQL
GraphQL memindahkan kerumitan ke pelayan. Perkara baharu yang kini perlu anda urus:
- kueri N+1 — penyelesai bersarang mencetuskan satu kueri pangkalan data bagi setiap nod melainkan anda mengumpulkannya secara kelompok (DataLoader).
- kos kueri / had kedalaman — kueri bersarang secara mendalam yang berniat jahat boleh menyebabkan penafian perkhidmatan (DoS).
- penyimpanan cache lebih sukar; biasanya anda menyimpan cache pada lapisan penyelesai/data, bukan HTTP.
- pengendalian ralat berbeza — respons 200 OK masih boleh mengandungi tatasusunan
errors.
Ralat: 200 dengan Tatasusunan Ralat
Tidak seperti kod status REST, GraphQL lazimnya mengembalikan HTTP 200 dan melaporkan kegagalan separa dalam isi respons. data boleh diisi sebahagiannya sementara errors menyenaraikan perkara yang gagal. Klien anda mesti memeriksa kedua-duanya.
{
"data": { "user": null },
"errors": [
{
"message": "User not found",
"path": ["user"],
"extensions": { "code": "NOT_FOUND" }
}
]
}Panduan Membuat Keputusan
Peraturan praktikal:
- API awam, banyak menggunakan cache, operasi cipta, baca, kemas kini dan padam berorientasikan sumber → REST.
- API dalaman/produk yang membekalkan klien pelbagai yang kaya dengan ciri melalui data yang saling berkaitan → GraphQL.
- Banyak bahagian belakang untuk disatukan di sebalik satu kontrak bertaip → gerbang GraphQL.
Menjalankan kedua-duanya adalah perkara biasa dan baik: REST untuk webhook/muat naik, GraphQL untuk graf bacaan aplikasi.
Menyediakan GraphQL melalui HTTP dalam PHP
Dari segi operasi, titik akhir GraphQL dalam PHP ialah satu laluan yang membaca isi JSON, mengeluarkan query dan variables, melaksanakannya terhadap skema, lalu mengembalikan { data, errors }. Berbanding banyak laluan REST, pengangkutannya seragam — semua variasi berada dalam rentetan kueri yang dihantar oleh klien.
<?php
// Minimal GraphQL-over-HTTP entry point
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$query = $input['query'] ?? '';
$variables = $input['variables'] ?? null;
// $result = GraphQL::executeQuery($schema, $query, null, $ctx, $variables);
// header('Content-Type: application/json');
// echo json_encode($result->toArray());
var_dump(['query' => $query, 'variables' => $variables]);
Semakan Ringkas
Bilakah REST mengekalkan kelebihan yang jelas berbanding GraphQL?
Imbas Kembali
Anda telah membandingkan GraphQL dan REST dari segi asas:
- GraphQL mengatasi pengambilan data berlebihan atau terkurang dengan satu titik akhir bertaip dan pemilihan dipacu klien.
- GraphQL cemerlang untuk banyak klien, data berbentuk graf dan pengagregatan bahagian belakang.
- REST kekal kukuh untuk API awam yang boleh disimpan dalam cache, operasi cipta, baca, kemas kini dan padam yang ringkas, muat naik serta pengguna konvensional.
- GraphQL memindahkan kos ke pelayan: N+1, had kos kueri, penyimpanan cache dan semantik 200-dengan-ralat.
Seterusnya: membina skema dengan webonyx/graphql-php.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “GraphQL berbanding REST” percuma?
Ya — teks penuh “GraphQL berbanding REST” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “GraphQL berbanding REST”?
Fahami bila GraphQL lebih baik daripada REST dan sebabnya. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “GraphQL berbanding REST” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- GraphQL berbanding REST
- Membina Skema dengan graphql-php
- Penyelesai, Mutasi dan Langganan
- Prestasi: N+1 dan DataLoader