عميل HTTP لجافا: أفضل المكتبات للعمل مع طلبات HTTP
تطوير جافا الحديث لا يمكن تصوره بدون التفاعل مع الخدمات الخارجية عبر HTTP. سواء كان REST API أو webhooks أو تحميل الملفات - عميل HTTP عالي الجودة هو أساس أي تطبيق شبكي. في هذه المقالة، سنستعرض أربع من أفضل المكتبات لجافا: من Apache HttpClient الكلاسيكي إلى Retrofit الحديث. ستتعرف على نقاط قوتها، وسيناريوهات الاستخدام النموذجية، وسترى أمثلة على الكود.
1. Apache HttpClient (Apache HttpComponents)
هذه هي أشهر وأكثر مكتبات HTTP نضجًا في جافا. تم تطويرها منذ عام 2004، وتدعم HTTP/1.1 و HTTP/2، وإعدادات مرنة لمجموعة الاتصالات، والبروكسي، والمصادقة، ومعترضات الطلبات. مثالية لتطبيقات الخادم ذات المتطلبات العالية للتخصيص.
مثال لطلب GET:
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.HttpClients;
try (CloseableHttpClient client = HttpClients.createDefault()) { HttpGet request = new HttpGet("https://api.example.com/data"); String response = client.execute(request, classicHttpResponse -> { return new String(classicHttpResponse.getEntity().getContent().readAllBytes()); }); System.out.println(response);}الميزات الرئيسية:
- دعم كامل لـ HTTP/1.1 و HTTP/2
- إدارة مرنة لمجموعة الاتصالات والمهلات الزمنية
- دعم مدمج لخوادم البروكسي و SSL/TLS
- نظام بيئي واسع من الإضافات والمعترضات
- التوافق مع Java 8+
2. OkHttp
مكتبة حديثة من Square، محسّنة لنظام Android و Java 8+. تتميز بأداء عالٍ بفضل الإدخال/الإخراج غير المتزامن وتعدد الإرسال المدمج لـ HTTP/2. يدير OkHttp تلقائيًا إعادة المحاولات، والتخزين المؤقت، وضغط البيانات. غالبًا ما يُستخدم مع Retrofit.
طلب غير متزامن:
import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS) .build();
Request request = new Request.Builder() .url("https://api.example.com/data") .build();
client.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { System.err.println("خطأ: " + e.getMessage()); }
@Override public void onResponse(okhttp3.Call call, Response response) throws IOException { if (response.isSuccessful()) { System.out.println(response.body().string()); } }});المزايا:
- دعم تلقائي لـ HTTP/2 و SPDY
- تخزين مؤقت وضغط مدمج (gzip)
- استدعاءات غير متزامنة دون حظر الخيوط
- حجم JAR صغير (~600 كيلوبايت)
- التكامل مع Android و Kotlin
3. Java 11 HttpClient (قياسي)
بدءًا من Java 11، تمت إضافة عميل HTTP حديث إلى مكتبة JDK القياسية. يدعم HTTP/2 و WebSocket وتدفقات البيانات التفاعلية والطلبات المتزامنة/غير المتزامنة. حل مثالي للمشاريع التي لا ترغب في إضافة تبعيات خارجية.
طلب GET متزامن مع معالجة الأخطاء:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/data")) .GET() .build();
try { HttpResponse<St