latar belakang
Dengan open source of React, Facebook telah secara berturut -turut membuka banyak proyek terkait. Proyek -proyek ini telah digunakan di dalamnya selama bertahun -tahun. Yang menarik perhatian saya adalah bahwa kali ini adalah GraphQL. Saat ini, hanya ada versi nodeJS dari situs web resmi. Karena tumpukan teknologi backend banyak perusahaan adalah Java, ada implementasi GraphQL versi Java, yang dapat ditemukan di GitHub. Tanpa basa -basi lagi, lihat saja kodenya. Untuk perkenalan khusus, kunjungi situs web resmi kafe, jika tidak, itu akan keluar dari topik.
Graphqlschema
Skema setara dengan database, terdiri dari banyak graphqlfieldDefinitions, bidang setara dengan tabel/tampilan basis data, dan setiap tabel/tampilan terdiri dari nama, parameter kueri, struktur data, dan data.
1) Pertama -tama mendefinisikan bidang struktur data (graphqLoutputType), dan kemudian tentukan metode inisialisasi
Private GraphQLoutPutType userType; private void initoutputType () { / *** Struktur objek anggota* / userType = newObject () .name ("user") .field (newFieldDefinition (). name ("id). .field (newfielddefinition (). name ("name"). type (graphqlstring) .build ()) .field (newfielddefinition (). name ("pic"). type (graphqlstring) .build ()) .build ();}2) Tentukan dua tabel/tampilan lagi, yang mencakup nama, parameter kueri, struktur data, dan pengambilan data
/ *** Permintaan informasi pengguna tunggal* @return*/ private graphqlfieldDefinition createUserfield () {return graphqlfielddefinition.newfieldDefinition () .name ("user") .Argument (newargument (). Name ("id"). Tipe (graphqlint) .build (). Parameter Int = Lingkungan.getArgument ("ID"); .membangun(); } / *** Permintaan beberapa informasi anggota* @return* / private graphqlfieldDefinition createUsersfield () {return graphqlfielddefinition.newfieldDefinition () .name ("Users") .Argument (newArgument (). Nama ("halaman"). Tipe (graphqlint) .build ())). Name ("halaman"). .Argument (newargument (). name ("size"). Type (graphqlint) .build ()) .Argument (newargument (). name ("name"). type (graphqlString) .build () .type (gets page = page = page = page = page = devery (query) .datafetcher (lingkungan -> query (queryget). size =getArgument (ukuran "); 2); }3) Kemudian tentukan skema dan inisialisasi, berisi nama, dan satu atau lebih tabel/tampilan (bidang)
skema graphqlschema pribadi; grafik publik () {initoutputType (); schema = graphqlschema.newschema (). Query (newObject () .name ("GraphQuery") .field (createUsersfield ()) .field (createUserfield ()) .build ()). build (); }4) Setelah menyelesaikan langkah -langkah di atas, Anda perlu mendefinisikan model, tanpa batas nama kelas, tetapi struktur perlu memenuhi struktur data yang ditentukan di atas, dan harus publik.
pengguna kelas publik {private int id; usia int pribadi; seks pribadi int; nama string pribadi; pic string pribadi; // Getter, Setter ...}5) Kemudian tulis metode utama untuk mengujinya
public static void main (string [] args) {graphqlschema schema = new graphschema (). getschema (); String query1 = "{Users (halaman: 2, ukuran: 5, nama:/" john/") {id, seks, nama, pic}}"; String query2 = "{user (id: 6) {id, sex, name, pic}}"; String query3 = "{User (id: 6) {id, seks, nama, pic}, pengguna (halaman: 2, ukuran: 5, nama:/" john/") {id, seks, nama, pic}}"; Peta <String, Object> result1 = (MAP <String, Object>) baru graphql (skema) .execute (query1) .getData (); Peta <String, Object> result2 = (MAP <String, Object>) baru graphql (skema) .execute (query2) .getData (); Peta <String, Object> result3 = (MAP <String, Object>) baru graphql (skema) .execute (query3) .getData (); // query The User List System.out.println (result1); // query satu pengguna sistem.out.println (result2); // periksa system.out.println (result3);}Keluaran:
{Users = [{id = 0, sex = 0, name = John_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, name = John_2_1, pic = pic_1.jpg}, {id = 2, seks = 0, nama = John_2_2, pic = pic_2.jpg}, {{2, name = John_2_2, pic_2.jpg {{{name = John_2, pic_. pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}}{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}, users=[{id=0, seks = 0, name = John_2_0, pic = pic_0.jpg}, {id = 1, seks = 1, name = John_2_1, pic = pic_1.jpg}, {id = 2, seks = 0, name = John_2_2, pic = pic_2.jpg}, {id = 3, name = name = name = pic = pic_2.jpg}, {id = 3, name = name = name = pic = pic_2 sex = 0, name = John_2_4, pic = pic_4.jpg}]}6) Akhirnya, masukkan kode dalam metode utama pada lapisan web, dan hanya perlu menentukan parameter kueri, mudah untuk membangun layanan kueri. Antarmuka kueri asli masih dipanggil di datafetcher.
7) Memperkenalkan dependensi Maven
<dependency> <GroupId> com.graphql-java </groupId> <ArTifactId> graphql-java </arttifactid> <version> 2.0.0 </version> </dependency>
Mengenai definisi kueri graphql, lihat ini mungkin bermanfaat bagi Anda
json
{id = 6, sex = 0, name = "name_6", pic = "pic_6.jpg"}pertanyaan
{id, seks, nama, pic}Bagian terakhir sebenarnya adalah string JSON. Hasil penghapusan = dan nilainya masih dapat dibaca.
Kesimpulan
GraphQL menghadirkan cara berpikir baru, yang dapat menyederhanakan pengembangan API Web. Klien menentukan data apa yang diperlukan dan data apa yang dikembalikan oleh server, mengurangi transmisi lalu lintas yang tidak perlu, ramah pada terminal seluler, dan juga menyediakan berbagai permintaan agregasi data. Beberapa pertanyaan hanya menggunakan satu permintaan, yang tidak hanya memenuhi granularitas minimum API, tetapi juga memenuhi kebutuhan front-end, mengurangi permintaan, dan meningkatkan kinerja.
Saya merasa bahwa saya akan berkembang ke arah ini di masa depan, didorong oleh tren umum.