مقدمة في GraphQL API بلغة Java
\n\nGraphQL هي لغة استعلام لواجهات API، تتيح للعملاء طلب البيانات التي يحتاجونها فقط. على عكس REST، حيث يكون هيكل الاستجابة ثابتًا، فإن GraphQL يسمح بتشكيل الاستجابات بمرونة، مما يقلل بشكل كبير من حجم البيانات المنقولة ويسرع التطوير.
\n\nفي هذا الدليل التعليمي، سنشرح عمليًا كيفية إنشاء GraphQL API مع Java باستخدام مكتبة graphql-java وإطار العمل Spring Boot. ستتعلم كيفية إعداد المخطط (Schema)، وكتابة المحللات (Resolvers)، وتنفيذ الاستعلامات.
ستكون المقالة مفيدة لمطوري Java الذين يرغبون في إتقان النهج الحديث لبناء واجهات API وتحسين التفاعل بين العميل والخادم.
\n\n1. إعداد المشروع والتبعيات
\n\nلنبدأ بإنشاء مشروع Spring Boot جديد. الأفضل استخدام Spring Initializr. أضف التبعيات التالية:
\n\n- \n
- Spring Web — لتشغيل خادم الويب \n
- Spring Boot DevTools — لتسريع التطوير \n
- Lombok — لتقليل الكود النمطي \n
بعد إنشاء المشروع، أضف مكتبة GraphQL الأساسية إلى pom.xml:
<dependency>\n <groupId>com.graphql-java</groupId>\n <artifactId>graphql-java-spring-boot-starter-webmvc</artifactId>\n <version>2021-06-30T00-00-00-1e4b5e5</version>\n</dependency>\n\nستحتاج أيضًا إلى مكتبة للعمل مع أداة GraphiQL (واجهة ويب لاختبار الاستعلامات):
\n\n<dependency>\n <groupId>com.graphql-java</groupId>\n <artifactId>graphiql-spring-boot-starter</artifactId>\n <version>5.0.2</version>\n</dependency>\n\nبعد إضافة التبعيات، قم بتحديث المشروع وتشغيله. افتراضيًا، سيكون GraphiQL متاحًا على العنوان http://localhost:8080/graphiql.
2. إنشاء نموذج البيانات ومخطط GraphQL
\n\nللتوضيح، سننشئ نموذجًا بسيطًا Book (كتاب). حدد الفئة بالحقول id و title و author و pages.
import lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Book {\n private String id;\n private String title;\n private String author;\n private int pages;\n}\n\nالآن، نحتاج إلى تعريف مخطط GraphQL. أنشئ ملف schema.graphqls في مجلد src/main/resources:
type Query {\n allBooks: [Book]\n bookById(id: String): Book\n}\n\ntype Book {\n id: String\n title: String\n author: String\n pages: Int\n}\n\nيصف المخطط استعلامين: الحصول على جميع الكتب والحصول على كتاب حسب المعرف. النوع Book يحتوي على أربعة حقول.
\n\nلمعالجة الاستعلامات، سننشئ خدمة تخزن البيانات في الذاكرة (للتبسيط):
\n\nimport org.springframework.stereotype.Service;\nimport javax.annotation.PostConstruct;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\n@Service\npublic class BookService {\n private List<Book> books = new ArrayList<>();\n\n @PostConstruct\n public void init() {\n books.add(new Book("1", "الحرب والسلام", "ليو تولستوي", 1225));\n books.add(new Book("2", "الجريمة والعقاب", "فيودور دوستويفسكي", 671));\n books.add(new Book("3", "السيد ومارجريتا", "ميخائيل بولغاكوف", 480));\n }\n\n public List<Book> getAllBooks() {\n return books;\n }\n\n public Book getBookById(String id) {\n Optional<Boo