هل رغبت يومًا في إنشاء تطبيق ويب أو خدمة صغيرة باستخدام Java، ولكن شعرت بالإرهاق بسبب التعقيد والتكوين المطلوبين؟ إذا كان الأمر كذلك، فأنت لست وحدك. يواجه العديد من المطورين تحديات تطوير الويب، مثل إعداد الخادم، وإدارة التبعيات، والتعامل مع قاعدة البيانات، وأكثر من ذلك.
لهذا السبب، يعتبر Spring Boot محوريًا في هذا المجال. Spring Boot هو إطار عمل يبسط تطوير الويب باستخدام Java. يوفر ميزات مثل الإعداد التلقائي، والخوادم المدمجة، وتبعيات البداية، وأكثر من ذلك. مع Spring Boot، يمكنك التركيز على كتابة منطق عملك، بدلاً من التعامل مع الكود النمطي.
ولكن إنشاء تطبيق ويب أو خدمة صغيرة ليس كافيًا. تحتاج أيضًا إلى اختباره. يعتبر الاختبار أمرًا بالغ الأهمية لضمان جودة وموثوقية برنامجك. يساعدك في العثور على الأخطاء وإصلاحها، وتحسين الأداء، ومنع الأخطاء.
هنا يأتي دور Apidog.
في هذه التدوينة، ستتعلم كيفية بناء واختبار واجهة برمجة تطبيقات Spring Boot باستخدام Apidog. ستقوم بإنشاء واجهة برمجة تطبيقات RESTful بسيطة باستخدام Spring Boot واختبارها باستخدام Apidog.
ما هو Spring Boot ولماذا تستخدمه؟
Spring Boot هو إطار عمل يبسط تطوير تطبيقات Spring. يوفر الكثير من الميزات والاتفاقيات التي تجعل من الأسهل إنشاء وتكوين وتشغيل ونشر تطبيقات Spring. بعض فوائد استخدام Spring Boot هي:
- يمتلك نظام إدارة تبعيات البداية الذي يضيف تلقائيًا المكتبات والإصدارات المطلوبة لمشروعك.
- يمتلك خادم ويب مدمج يتيح لك تشغيل تطبيقك دون أي إعدادات أو تثبيت إضافي.
- يمتلك آلية إعداد تلقائي تكشف وتطبق الإعدادات المثلى لتطبيقك بناءً على التبعيات والبيئة.
- يمتلك دعمًا جاهزًا للإنتاج يتضمن ميزات مثل فحوصات الصحة، والقياسات، والتسجيل، والأمان.
مع Spring Boot، يمكنك التركيز على كتابة منطق عملك ودع الإطار يتولى الباقي.
ما هو Apidog وكيف يمكنه مساعدتك في اختبار واجهة برمجة التطبيقات الخاصة بك؟
Apidog هي أداة تساعدك في اختبار واجهات برمجة التطبيقات الخاصة بك بطريقة بسيطة وبديهية. تتيح لك الاتصال بواجهة برمجة التطبيقات الخاصة بك، واستكشاف النقاط النهائية، وإنشاء وتشغيل حالات الاختبار لواجهة برمجة التطبيقات الخاصة بك. بعض ميزات APIdog هي:
- يمتلك واجهة مستخدم رسومية تجعل من السهل التفاعل مع واجهة برمجة التطبيقات الخاصة بك ورؤية النتائج.
- يمتلك محرر كود يتيح لك كتابة وتحرير حالات الاختبار الخاصة بك باستخدام JavaScript وChai assertions.
- يمتلك منفذ اختبار ينفذ حالات الاختبار الخاصة بك ويظهر الحالة، والإخراج، والأخطاء لكل اختبار.
- يمتلك مولد تقارير ينشئ تقريرًا شاملاً وقابل للتخصيص حول نتائج اختباراتك.
مع Apidog، يمكنك اختبار واجهة برمجة التطبيقات الخاصة بك بطريقة سريعة وموثوقة وضمان جودتها ووظيفتها.
إعداد المشروع
الخطوة الأولى هي إنشاء مشروع Spring Boot باستخدام Spring Initializr. Spring Initializr هي أداة ويب تولد هيكل مشروع أساسي وتكوين لك بناءً على تفضيلاتك. لاستخدام Spring Initializr، اتبع هذه الخطوات:
اذهب إلى https://start.spring.io/ واملأ تفاصيل مشروعك. في هذا المثال، سأستخدم الإعدادات التالية:
- المشروع: Maven Project
- اللغة: Java
- Spring Boot: 3.2.3
- بيانات المشروع:
- المجموعة: com.example
- العنصر: apidog-demo
- الاسم: apidog-demo
- الوصف: مشروع تجريبي لـ Spring Boot
- اسم الحزمة: com.example.apidog-demo
- التعبئة: Jar
- Java: 17
- التبعيات: Spring Web، Spring Data JPA، قاعدة بيانات H2
انقر على زر توليد لتنزيل ملف zip الخاص بمشروعك.
فك ضغط ملف zip وافتح المشروع في IDE المفضل لديك.
إضافة التبعيات لـ Spring Web وSpring Data JPA
الخطوة التالية هي إضافة التبعيات لـ Spring Web وSpring Data JPA. Spring Web هو وحدة توفر الدعم الأساسي لبناء واجهات برمجة التطبيقات RESTful باستخدام Spring. Spring Data JPA هي وحدة تبسط الوصول والتعامل مع البيانات في قواعد البيانات العلائقية باستخدام JPA وHibernate.
لإضافة هذه التبعيات، يمكنك استخدام Spring Initializr كما هو مذكور أعلاه، أو يمكنك تحرير ملف pom.xml الخاص بمشروعك يدويًا وإضافة التبعيات التالية:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
تكوين خصائص التطبيق
الخطوة التالية هي تكوين خصائص التطبيق. يحتوي ملف application.properties على أزواج المفتاح-القيمة التي تحدد سلوك وإعدادات تطبيقك. في هذا المثال، سنستخدم الخصائص التالية:
# تمكين وحدة التحكم H2 للوصول إلى قاعدة البيانات
spring.h2.console.enabled=true
# تعيين مسار وحدة تحكم H2
spring.h2.console.path=/h2-console
# تعيين عنوان URL لقاعدة البيانات
spring.datasource.url=jdbc:h2:mem:testdb
# تعيين اسم مستخدم قاعدة البيانات
spring.datasource.username=sa
# تعيين كلمة مرور قاعدة البيانات
spring.datasource.password=
# تعيين لهجة قاعدة البيانات
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# إظهار جمل SQL في وحدة التحكم
spring.jpa.show-sql=true
# إنشاء مخطط قاعدة البيانات من صفوف الكيانات
spring.jpa.hibernate.ddl-auto=update
# تمكين واجهة مستخدم Swagger لتوثيق واجهة برمجة التطبيقات
springdoc.swagger-ui.enabled=true
# تعيين مسار واجهة مستخدم Swagger
springdoc.swagger-ui.path=/swagger-ui.html
إنشاء واجهة برمجة التطبيقات
الخطوة التالية هي إنشاء واجهة برمجة التطبيقات. ستتكون واجهة برمجة التطبيقات من نموذج مجال، ومستودع، وcontroller لعنصر بسيط يسمى Book. سيكون للكتاب الخصائص التالية: id، title، author، و price.
إنشاء نموذج المجال ومستودع لعنصر بسيط
نموذج المجال هو فئة تمثل البيانات والسلوك للعنصر. المستودع هو واجهة تمتد إلى واجهة JpaRepository وتوفر الأساليب للوصول إلى البيانات والتعامل معها للعنصر.
لإنشاء نموذج المجال والمستودع لعنصر الكتاب، اتبع هذه الخطوات:
- إنشاء حزمة جديدة تسمى com.example.apidogdemo.model وإنشاء فئة جديدة تسمى Book.java داخلها.
- توسيم الفئة بـ @Entity لتحديدها ككيان JPA و@Table لتحديد اسم الجدول في قاعدة البيانات.
- تعريف خصائص الفئة وتوسيمها بـ @Id، @GeneratedValue، @Column، و@NotNull لتحديد المفتاح الأساسي، واستراتيجية التوليد، واسم العمود، وقيود التحقق على التوالي.
- توليد أساليب الوصول setter وgetter، والبناء، وطريقة toString للفئة.
يجب أن تبدو فئة Book.java على النحو التالي:
package com.example.apidogdemo.model;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Entity
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title")
@NotNull
private String title;
@Column(name = "author")
@NotNull
private String author;
@Column(name = "price")
@NotNull
private BigDecimal price;
public Book() {
}
public Book(Long id, String title, String author, BigDecimal price) {
this.id = id;
this.title = title;
this.author = author;
this.price = price;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", title='" + title + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
- إنشاء حزمة جديدة تسمى com.example.apidogdemo.repository وإنشاء واجهة جديدة تسمى BookRepository.java داخلها.
- توسيم الواجهة بـ @Repository لتحديدها كمستودع Spring Data JPA.
- مد واجهة JpaRepository وحدد نوع الكيان ونوع المفتاح الأساسي كمعلمات عامة.
- اختياريًا، يمكنك تعريف طرق مخصصة لاستعلام بيانات الكيان.
يجب أن تبدو واجهة BookRepository.java على النحو التالي:
package com.example.apidogdemo.repository;
import com.example.apidogdemo.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
// يمكنك تعريف طرق مخصصة هنا
}
إنشاء وحدة تحكم وتعريف النقاط النهائية لعمليات CRUD
وحدة التحكم هي فئة تعالج الطلبات والاستجابات الخاصة بواجهة برمجة التطبيقات. تحدد وحدة التحكم النقاط النهائية لعمليات CRUD (إنشاء، قراءة، تحديث، وحذف) للكيان.
لإنشاء وحدة التحكم وتعريف النقاط النهائية للكيان Book، اتبع هذه الخطوات:
- إنشاء حزمة جديدة تسمى com.example.apidogdemo.controller وإنشاء فئة جديدة تسمى BookController.java داخلها.
- توسيم الفئة بـ @RestController لتحديدها كـ Spring MVC controller التي تعيد استجابات بصيغة JSON.
- توسيم الفئة بـ @RequestMapping لتحديد المسار الأساسي للنقاط النهائية.
- حقن مثيل BookRepository باستخدام توسيع @Autowired.
- تحديد النقاط النهائية لعمليات CRUD باستخدام التعليقات التوضيحية @GetMapping، @PostMapping، @PutMapping، و@DeleteMapping وتحديد المسار ومعلمات كل نقطة نهائية.
- استخدام فئة ResponseEntity لتغليف بيانات الاستجابة ورمز الحالة لكل نقطة نهائية.
- استخدام التعليق التوضيحي @Valid للتحقق من جسم الطلب لنقاط النهاية لإنشاء وتحديث.
- استخدام التعليقات التوضيحية @ExceptionHandler و@ResponseStatus لمعالجة الاستثناءات وإرجاع رمز الحالة والرسالة المناسبة.
يجب أن تبدو فئة BookController.java على النحو التالي:
package com.example.apidogdemo.controller;
import com.example.apidogdemo.model.Book;
import com.example.apidogdemo.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import javax.validation.Valid;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api/books")
public class BookController {
@Autowired
private BookRepository bookRepository;
// احصل على جميع الكتب
@GetMapping
public ResponseEntity<List<Book>> getAllBooks() {
List<Book> books = bookRepository.findAll();
return new ResponseEntity<>(books, HttpStatus.OK);
}
// احصل على كتاب بواسطة id
@GetMapping("/{id}")
public ResponseEntity<Book> getBookById(@PathVariable Long id) {
Optional<Book> book = bookRepository.findById(id);
if (book.isPresent()) {
return new ResponseEntity<>(book.get(), HttpStatus.OK);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "الكتاب غير موجود");
}
}
// إنشاء كتاب
@PostMapping
public ResponseEntity<Book> createBook(@Valid @RequestBody Book book) {
Book savedBook = bookRepository.save(book);
return new ResponseEntity<>(savedBook, HttpStatus.CREATED);
}
// تحديث كتاب بواسطة id
@PutMapping("/{id}")
public ResponseEntity<Book> updateBook(@PathVariable Long id, @Valid @RequestBody Book book) {
Optional<Book> existingBook = bookRepository.findById(id);
if (existingBook.isPresent()) {
book.setId(id);
Book updatedBook = bookRepository.save(book);
return new ResponseEntity<>(updatedBook, HttpStatus.OK);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "الكتاب غير موجود");
}
}
// حذف كتاب بواسطة id
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBook(@PathVariable Long id) {
Optional<Book> existingBook = bookRepository.findById(id);
if (existingBook.isPresent()) {
bookRepository.deleteById(id);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} else {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "الكتاب غير موجود");
}
}
// معالجة استثناءات التحقق
@ExceptionHandler(javax.validation.ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationExceptions(javax.validation.ConstraintViolationException ex) {
return ex.getMessage();
}
}
اختبار واجهة برمجة تطبيقات Spring boot باستخدام APIdog
الخطوة النهائية هي اختبار واجهة برمجة التطبيقات باستخدام Apidog. Apidog هي أداة تساعدك في اختبار واجهات برمجة التطبيقات الخاصة بك بطريقة بسيطة وبديهية. تتيح لك الاتصال بواجهة برمجة التطبيقات الخاصة بك، واستكشاف النقاط النهائية، وإنشاء وتشغيل حالات الاختبار لواجهة برمجة التطبيقات الخاصة بك.
لاختبار واجهة برمجة التطبيقات باستخدام Apidog، اتبع هذه الخطوات:
- قم بتشغيل Apidog وأنشئ مشروعًا جديدًا عن طريق النقر على زر مشروع جديد.
- أدخل اسم ووصف مشروعك وانقر على زر الإنشاء.
- أدخل عنوان URL الأساسي لواجهة برمجة التطبيقات الخاصة بك وانقر على زر الاتصال.
- يمكنك رؤية قائمة النقاط النهائية لواجهة برمجة التطبيقات الخاصة بك على اللوحة اليسرى. يمكنك النقر على كل نقطة نهائية لرؤية التفاصيل والأمثلة على اللوحة اليمنى.
- يمكنك إنشاء وتشغيل حالات الاختبار لواجهة برمجة التطبيقات الخاصة بك عن طريق النقر على علامة التبويب حالات الاختبار على اللوحة اليمنى. يمكنك استخدام محرر الكود لكتابة وتحرير حالات الاختبار باستخدام JavaScript وChai assertions.
يمكنك استخدام منفذ الاختبار لتنفيذ حالات الاختبار الخاصة بك ورؤية الحالة والإخراج والأخطاء لكل اختبار. يمكنك استخدام مولد التقارير لإنشاء تقرير شامل وقابل للتخصيص حول نتائج اختبارك.
الخاتمة
في هذه التدوينة، تعلمت كيفية بناء واختبار واجهة برمجة تطبيقات Spring Boot باستخدام Apidog. لقد أنشأت واجهة برمجة تطبيقات RESTful بسيطة باستخدام Spring Boot واختبرتها باستخدام Apidog.
Spring Boot هو إطار عمل يبسط تطوير الويب باستخدام Java. يوفر ميزات مثل الإعداد التلقائي، والخوادم المدمجة، وتبعيات البداية، وأكثر من ذلك. مع Spring Boot، يمكنك التركيز على كتابة منطق عملك، بدلاً من التعامل مع الكود النمطي.
Apidog هي أداة تساعدك في اختبار وتصحيح واجهات برمجة التطبيقات الخاصة بك. تتيح لك الاتصال بواجهة برمجة التطبيقات الخاصة بك واستكشاف النقاط النهائية، وإنشاء وتشغيل حالات الاختبار، وتوليد التقارير. مع Apidog، يمكنك اختبار واجهة برمجة التطبيقات الخاصة بك بشكل أسرع وأسهل، دون كتابة أي كود.