عميل HTTP بلغة Java: إجراء الطلبات بشكل صحيح من الألف إلى الياء
في التطوير الحديث بلغة Java، أصبح التفاعل مع خدمات الويب الخارجية وREST API جزءًا لا يتجزأ من أي تطبيق تقريبًا. بغض النظر عما إذا كنت تكتب خدمة مصغرة أو تطبيق جوال أو نظامًا مؤسسيًا، فإن القدرة على إرسال طلبات HTTP بشكل صحيح هي مهارة بالغة الأهمية. في هذه المقالة، سنستعرض جميع طرق إنشاء عميل HTTP بلغة Java: من HttpURLConnection الكلاسيكي إلى المكتبات الحديثة مثل java.net.http.HttpClient وOkHttp وRestTemplate. ستتعلم كيفية إجراء طلبات GET وPOST وPUT وDELETE، ومعالجة الردود، واختيار الأداة المناسبة لمهمتك.
1. النهج الكلاسيكي: HttpURLConnection
لسنوات عديدة، كانت الطريقة القياسية للعمل مع HTTP في Java هي فئة HttpURLConnection. وهي مضمنة في JDK ولا تتطلب تبعيات إضافية. ومع ذلك، تعتبر واجهة برمجة التطبيقات الخاصة بها منخفضة المستوى ومرهقة، خاصة بالنسبة للطلبات المعقدة.
مثال على طلب GET:
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
public class HttpURLConnectionExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json");
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("Response: " + response.toString()); }}مثال على طلب POST مع JSON:
import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;
public class PostExample { public static void main(String[] args) throws Exception { URL url = new URL("https://api.example.com/users"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true);
String jsonInputString = "{\\"name\\": \\"John\\", \\"age\\": 30}"; try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonInputString.getBytes("utf-8"); os.write(input, 0, input.length); }
int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); }}الإيجابيات: مضمن في JDK، لا يتطلب مكتبات.
السلبيات: كود معقد، لا يدعم HTTP/2، التعامل مع المهلات والأخطاء غير مريح.
2. HttpClient الحديث (Java 11+)
بدءًا من Java 11، تمت إضافة java.net.http.HttpClient جديد إلى المكتبة القياسية. وهو يدعم HTTP/2 وWebSocket والطلبات غير المتزامنة ويوفر واجهة برمجة تطبيقات أكثر نظافة وحداثة.
طلب GET متزامن:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
public class ModernHttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://a