تخطَّ إلى المحتوى

HTTP/3 (JEP 517)

دعم HTTP/3 في HttpClient (Java 26) HTTP/3 (JEP 517)

منذ Java 26 (JEP 517)، يمكن لـ HttpClient إرسال طلبات عبر HTTP/3 اختياريًا — بروتوكول يعمل فوق QUIC بدل TCP، ويحل مشكلة head-of-line blocking ويدعم هجرة الاتصال بين الشبكات.

Java 26 (إصدار غير LTS، صدر في مارس 2026) أضافت لـ HttpClient دعمًا لبروتوكول HTTP/3 عبر JEP 517. HTTP/3 يعمل فوق QUIC — بروتوكول نقل حديث مبني على UDP بدل TCP — وله فائدتان عمليتان رئيسيتان: كل مجرى بيانات (stream) مستقل فلا يتأثر الجميع بفقدان حزمة واحدة (على عكس HTTP/2)، والاتصال يُعرَّف برقم خاص بدل عنوان IP فلا ينقطع عند تغيير الشبكة (هجرة الاتصال).

HTTP/2 يبقى البروتوكول الافتراضي — التفعيل اختياري صراحةً عبر .version(HttpClient.Version.HTTP_3) على العميل أو الطلب. للتحكم بطريقة الاكتشاف عند عدم التأكد من دعم الخادم، يوفّر HttpOption.H3_DISCOVERY قيمًا من Http3DiscoveryMode: ANY (الافتراضي، يحاول القنوات المتاحة ويعتمد الأسرع)، ALT_SVC (يبدأ بـ HTTP/2 وينتقل لاحقًا فقط إذا أعلن الخادم دعمه)، وHTTP_3_URI_ONLY (HTTP/3 حصرًا، يفشل بدون رجوع لبروتوكول أقدم).

الصياغة

HttpClient client = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_3)
        .build();

📄 مثال

import java.net.http.HttpOption;
import java.net.http.HttpOption.Http3DiscoveryMode;

HttpRequest request = HttpRequest.newBuilder(URI.create("https://example.com"))
        .version(HttpClient.Version.HTTP_3)
        .setOption(HttpOption.H3_DISCOVERY, Http3DiscoveryMode.HTTP_3_URI_ONLY)
        .GET()
        .build();

أهم النقاط

العنصرالوظيفة
HttpClient.Version.HTTP_3قيمة تُمرَّر لـ .version() على العميل أو الطلب لتفضيل HTTP/3
HttpOption.H3_DISCOVERYخيار يُمرَّر لـ setOption() للتحكم بطريقة اكتشاف اتصال HTTP/3
Http3DiscoveryMode.ANYالوضع الافتراضي — يحاول القنوات المتاحة (QUIC وTCP) ويعتمد الأسرع
Http3DiscoveryMode.ALT_SVCيرسل الطلب الأول عبر HTTP/2، وينتقل لـ HTTP/3 فقط إذا أعلن الخادم دعمه
Http3DiscoveryMode.HTTP_3_URI_ONLYHTTP/3 حصرًا — يفشل الطلب إن لم يستجب الخادم به

💡 نصائح عملية

  • لا حاجة لتغيير أي كود قائم — HTTP/2 يبقى الافتراضي حتى تطلب HTTP/3 صراحة
  • استخدم HTTP_3_URI_ONLY فقط عند التأكد الكامل من دعم الخادم لـ HTTP/3

⚠️ أخطاء شائعة

  • افتراض أن HTTP/3 يصبح تلقائيًا بمجرد الترقية لـ Java 26 — يحتاج تفعيلًا صريحًا عبر .version()
  • استخدام HTTP_3_URI_ONLY مع خادم غير مؤكد الدعم — يفشل الطلب بدل الرجوع لبروتوكول أقدم

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار JAVA الكامل بالعربي.