مقدمة: لماذا نحتاج عميل HTTP في جافا؟
\n\nالتطوير الحديث في جافا نادراً ما يخلو من التفاعل مع الخدمات الخارجية. سواء كان إرسال بيانات إلى خادم، أو الحصول على معلومات من REST API، أو التكامل مع المنصات السحابية — في كل مكان نحتاج إلى عميل HTTP. في جافا، توجد عدة طرق لتنفيذ طلب HTTP، ومن المهم اختيار النهج الصحيح.
\n\nلفترة طويلة، كانت الأداة القياسية هي مكتبة java.net.HttpURLConnection، ولكن مع إصدار Java 11 ظهرت وحدة جديدة وأكثر ملاءمة وهي java.net.http. في هذه المقالة، سنستعرض جميع مراحل العمل مع عميل HTTP في جافا: من طلبات GET البسيطة إلى إرسال JSON ومعالجة الأخطاء.
المقالة موجهة للمطورين الذين هم بالفعل على دراية بأساسيات جافا، ولكنهم يرغبون في تنظيم معرفتهم حول طلبات الشبكة. سنستخدم HttpClient المدمج من Java 11+، لأنه نهج حديث وموصى به.
1. أساسيات عميل HTTP: الإنشاء والتكوين
\n\nقبل إرسال الطلبات، نحتاج إلى إنشاء نسخة من HttpClient. هذا هو الكائن المركزي الذي يتم من خلاله تنفيذ جميع عمليات HTTP. دعنا نلقي نظرة على التكوين الأساسي.
إنشاء العميل
\n\nأبسط طريقة هي استخدام الطريقة الثابتة newHttpClient():
import java.net.http.HttpClient;\n\nHttpClient client = HttpClient.newHttpClient();\n\nومع ذلك، في المشاريع الحقيقية، غالباً ما يكون من الضروري ضبط المهلات الزمنية، أو إصدار البروتوكول، أو الوكيل. إليك مثال على تكوين متقدم:
\n\nimport java.net.http.HttpClient;\nimport java.time.Duration;\n\nHttpClient client = HttpClient.newBuilder()\n .version(HttpClient.Version.HTTP_2) // استخدام HTTP/2\n .connectTimeout(Duration.ofSeconds(10)) // مهلة الاتصال\n .followRedirects(HttpClient.Redirect.NORMAL) // متابعة إعادة التوجيه تلقائياً\n .build();\n\nمعلمات التكوين الهامة
\n\n- \n
- version — الاختيار بين HTTP/1.1 و HTTP/2 (افتراضياً HTTP/2 إذا كان الخادم يدعمه) \n
- connectTimeout — أقصى وقت انتظار للاتصال \n
- followRedirects — سياسة معالجة إعادة التوجيه (NEVER, ALWAYS, NORMAL) \n
- proxy — إعداد خادم الوكيل (إذا لزم الأمر) \n
لاحظ: يمكن استخدام نسخة واحدة من HttpClient لطلبات متعددة. إنه آمن للاستخدام مع الخيوط، لذا يمكن إنشاؤه مرة واحدة وإعادة استخدامه في جميع أنحاء التطبيق.
2. إنشاء وإرسال طلبات HTTP
\n\nالآن ننتقل إلى الجزء الرئيسي — تشكيل الطلبات. في Java 11+، يتم استخدام الفئة HttpRequest لهذا الغرض. دعنا نستعرض الأنواع الرئيسية للطلبات.
طلب GET: الحصول على البيانات
\n\nGET هو أبسط نوع من الطلبات. يُستخدم للحصول على البيانات من الخادم. مثال:
\n\nimport java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\nHttpRequest request = HttpRequest.newBuilder()\n .uri(URI.create("https://api.example.com/users"))\n .GET() // تحديد الطريقة بشكل صريح (يمكن حذفها، GET افتراضياً)\n .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n\nSystem.out.println("الحالة: " + response.statusCode());\nSystem.out.println("محتوى الاستجابة: " + response.body());\n\nالطريقة send() تنفذ طلباً متزامناً. إذا كنت بحاجة إلى تنفيذ غير متزامن، استخدم sendAsync() الذي يُرجع CompletableFuture.
طلب POST: إرسال البيانات
\n\nيُستخدم POST لإرسال البيانات إلى الخادم. غالباً ما يكون JSON أو نموذج. دعنا نلقي نظرة على كلا الخيارين.
\n\nPOST مع JSON:
\n\nimport java.net.http.HttpRequest.BodyPublishers;\n\nString json = "{\\"name\\":\\"إيفان\\",\\"email\\":\\"iva