خلفية
مع المصدر المفتوح لـ React ، فتح Facebook على التوالي العديد من المشاريع ذات الصلة. تم استخدام هذه المشاريع فيها لسنوات عديدة. ما جذب انتباهي هو أن هذه المرة هو GraphQL. حاليًا ، لا يوجد سوى إصدار NodeJS من الموقع الرسمي. نظرًا لأن العديد من مداخن تقنية الواجهة الخلفية للعديد من الشركات هي Java ، فهناك تنفيذ إصدار Java لـ GraphQL ، والذي يمكن العثور عليه على Github. دون مزيد من اللغط ، فقط انظر إلى الكود. للمقدمة المحددة ، انتقل إلى مقهى الموقع الرسمي ، وإلا فإنه سيكون خارج الموضوع.
GraphQlschema
المخطط يعادل قاعدة بيانات ، ويتألف من العديد من GraphQlFieldDefinitions ، والحقل يعادل جدول/عرض قاعدة البيانات ، ويتكون كل جدول/عرض من الاسم ومعلمات الاستعلام وهيكل البيانات والبيانات.
1) حدد أولاً حقل بنية البيانات (GraphQLoutputType) ، ثم حدد طريقة التهيئة
private graphqloutputtype usertype ؛ private void initOutputType () { / *** structure compit structure* / usertype = newObject () .Name ("user") .Field (NewFieldDefinition (). name ("id"). type (graphqlint) .build ()). .field (NewfieldDefinition (). الاسم ("العمر"). النوع (GraphQLint) .build ()) .field (NewfieldDefinition (). الاسم ("الاسم"). النوع (GraphQlString) .build ()) .field (NewfieldDefinition (). name ("pic"2) تحديد جدولين/طرق عرض أخرى ، والتي تشمل الأسماء ومعلمات الاستعلام وهياكل البيانات واسترجاع البيانات
/ *** Query معلومات المستخدم الفردي* return*/ private graphqlfieldDefinition createUserField () {return graphqlfieldDefinition.newfieldDefinition () .Name ("user" query parameters int id = environment.getArgument("id"); // Execute the query, here you can use some test data to illustrate the problem User user = new User(); user.setId(id); user.setAge(id + 15); user.setSex(id % 2); user.setName("Name_" + id); user.setPic("pic_" + id + ".jpg"); return user; }) .يبني()؛ } / *** Query معلومات عضوية متعددة* @return* / private graphqlfieldDefinition createUsersfield () {return graphqlfieldDefinition.newfieldDefinition () .Name ("المستخدمين") .Argument (newargument (). name ("page" .argument (newargument (). الاسم ("الحجم"). النوع (graphqlint) .build ()) .Argument (newArgument (). name ("name"). type (graphqlString) .build ()) .Type (new graphqllist (userType). environment.getArgument("page"); int size = environment.getArgument("size"); String name = environment.getArgument("name"); // Execute the query, here you can use some test data to illustrate the problem List<User> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { User user = new User(); user.setId(i); user.setAge(i + 15) ؛ }3) ثم حدد مخططًا وتهيئته ، ويحتوي على اسم ، وواحد أو أكثر من الجداول/المشاهدات (الحقول)
مخطط GraphQlschema الخاص ؛ Public GraphSchema () {initOutputType () ؛ schema = graphqlschema.newschema (). Query (newObject () .Name ("graphquery") .field (createUsersfield ()) .field (createUserfield ()) .build ()). build () ؛ }4) بعد الانتهاء من الخطوات المذكورة أعلاه ، تحتاج إلى تحديد نموذج ، مع عدم وجود حد لاسم الفصل ، ولكن يحتاج الهيكل إلى تلبية بنية البيانات المحددة أعلاه ، ويجب أن تكون عامة.
مستخدم الفئة العامة {private int id ؛ عصر INT الخاص ؛ الجنس الخاص اسم السلسلة الخاصة ؛ سلسلة خاصة الموافقة المسبقة عن علم // getter ، setter ...}5) ثم اكتب طريقة رئيسية لاختبارها
public static void main (string [] args) {graphqlschema schema = new GraphSchema (). getSchema () ؛ string query1 = "{users (الصفحة: 2 ، الحجم: 5 ، الاسم:/" john/") {id ، sex ، name ، pic}}" ؛ string query2 = "{user (id: 6) {id ، sex ، name ، pic}}" ؛ string query3 = "{user (id: 6) {id ، sex ، name ، pic} ، المستخدمين (الصفحة: 2 ، الحجم: 5 ، الاسم:/" John/") {id ، sex ، name ، pic}}" ؛ خريطة <سلسلة ، كائن> result1 = (خريطة <سلسلة ، كائن>) graphql جديد (مخطط) .execute (query1) .getData () ؛ خريطة <string ، object> result2 = (map <string ، object>) graphql new (schema) .execute (query2) .getData () ؛ خريطة <سلسلة ، كائن> result3 = (خريطة <سلسلة ، كائن>) graphql جديد (مخطط) .execute (query3) .getData () ؛ // الاستعلام عن قائمة المستخدم system.out.println (result1) ؛ // الاستعلام عن نظام مستخدم واحد. // check system.out.println (result3) ؛}الإخراج:
{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 ، sex = 0 ، name = john_2_2 ، pic =} ، {id = 1 ، 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 = sex = 0 ، name = John_2_0 ، pic = pic_0.jpg} ، {id = 1 ، sex = 1 ، name = john_2_1 ، pic = pic_1.jpg} ، {id = 2 ، sex = 0 ، name = john_2_2 ، pic = pic_2.jpg} ، {id = 3 ، sex = 1 ، name = sex = 0 ، name = john_2_4 ، pic = pic_4.jpg}]}6) أخيرًا ، ضع الكود في الطريقة الرئيسية على طبقة الويب ، وتحتاج فقط إلى تحديد معلمة استعلام ، من السهل إنشاء خدمة الاستعلام. لا تزال واجهة الاستعلام الأصلية تسمى في DataFetcher.
7) إدخال تبعيات Maven
<Rependency> <roupeD> com.graphql-java </rougeid> <StifactId> graphql-java </shintifactid> <الإصدار> 2.0.0 </version> </dependency>
فيما يتعلق بتعريف استعلام GraphQL ، انظر هذا قد يكون مفيدًا لك
جيسون
{id = 6 ، sex = 0 ، name = "name_6" ، pic = "pic_6.jpg"}استفسار
{id ، الجنس ، الاسم ، الموافقة المسبقة عن علم}الجزء الأخير هو في الواقع سلسلة JSON. نتيجة إزالة = والقيمة لا تزال قابلة للقراءة.
خاتمة
يجلب GraphQL طريقة جديدة للتفكير ، والتي يمكن أن تبسيط تطوير واجهات برمجة التطبيقات على الويب. يحدد العميل البيانات المطلوبة وما هي البيانات التي يتم إرجاعها بواسطة الخادم ، ويقلل من نقل حركة المرور غير الضرورية ، وهو ودود لأطراف المحمول ، ويوفر أيضًا مجموعة متنوعة من استعلامات تجميع البيانات. تستخدم الاستعلامات المتعددة طلبًا واحدًا فقط ، والذي لا يفي بالتقسيم الدنيا فقط من واجهة برمجة التطبيقات ، ولكنه يلبي أيضًا احتياجات الواجهة الأمامية ، ويقلل من الطلبات ، ويحسن الأداء.
أشعر أنني سوف أتطور في هذا الاتجاه في المستقبل ، مدفوعًا بالاتجاه العام.