عميل HTTP بلغة C#: إجراء الطلبات بشكل صحيح من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يعتبر عميل HTTP الصحيح مهمًا في C#



في التطوير الحديث باستخدام C# (.NET)، يعد العمل مع طلبات HTTP ضرورة أساسية. سواء كان الأمر يتعلق بالاتصال بـ REST API، أو تحميل البيانات من خادم ويب، أو التكامل مع الخدمات السحابية - لا يمكن الاستغناء عن عميل HTTP موثوق. ومع ذلك، يرتكب العديد من المطورين، خاصة المبتدئين، أخطاء نموذجية: إدارة غير صحيحة للاتصالات، تجاهل المهلات الزمنية، أو معالجة غير فعالة للردود. في هذه المقالة، سنقوم بتحليل إنشاء عميل HTTP بلغة C# من الأساسيات إلى التقنيات المتقدمة.



سنناقش الفئة HttpClient - الأداة الرئيسية للعمل مع HTTP في .NET، بالإضافة إلى الأساليب البديلة. ستتعلم كيفية إرسال طلبات GET و POST بشكل صحيح، ومعالجة JSON، وإدارة الرؤوس، وتجنب المشكلات الشائعة المتعلقة بالأداء.



الأساسيات: إنشاء وتهيئة HttpClient



التهيئة الصحيحة لـ HttpClient



تم تصميم الفئة HttpClient لإعادة الاستخدام. إنشاء مثيل جديد لكل طلب هو نمط معاكس يمكن أن يؤدي إلى استنزاف المقابس (sockets). بدلاً من ذلك، استخدم مثيلًا واحدًا للتطبيق بأكمله أو حقن التبعيات (DI) من خلال IHttpClientFactory.



// غير صحيح: إنشاء لكل طلبpublic async Task<string> BadRequest(string url){    using (var client = new HttpClient())    {        return await client.GetStringAsync(url);    }}

// صحيح: مثيل ثابتpublic static readonly HttpClient SharedClient = new HttpClient();

// أو من خلال IHttpClientFactory (موصى به لـ ASP.NET Core)services.AddHttpClient("MyClient", client =>{ client.BaseAddress = new Uri("https://api.example.com"); client.DefaultRequestHeaders.Add("Accept", "application/json");});


ضبط المهلات الزمنية والعنوان الأساسي



المهلات الزمنية تحمي التطبيق من التجميد عند عدم توفر الخادم. HttpClient له مهلة زمنية خاصة به، ولكن يمكن تجاوزها.



HttpClient client = new HttpClient{    BaseAddress = new Uri("https://jsonplaceholder.typicode.com"),    Timeout = TimeSpan.FromSeconds(10) // 10 ثوانٍ للطلب بأكمله};


من المفيد أيضًا تعيين MaxResponseContentBufferSize للحد من حجم البيانات المستلمة.



إرسال الطلبات: GET، POST، PUT و DELETE



طلب GET: الحصول على البيانات



أبسط طريقة للحصول على البيانات هي GetStringAsync أو GetAsync مع المعالجة اليدوية.



public async Task<string> GetUsersAsync(){    HttpResponseMessage response = await SharedClient.GetAsync("/users");    response.EnsureSuccessStatusCode(); // يرمي استثناءً عند حدوث خطأ    return await response.Content.ReadAsStringAsync();}

// أو بشكل أبسط:string json = await SharedClient.GetStringAsync("/users");


طلب POST: إرسال البيانات



لإرسال JSON، استخدم PostAsJsonAsync (يتطلب حزمة System.Net.Http.Json).



var newUser = new { name = "إيفان", email = "ivan@example.com" };HttpResponseMessage response = await SharedClient.PostAsJsonAsync("/users", newUser);if (response.IsSuccessStatusCode){    var createdUser = await response.Content.ReadFromJsonAsync<User>();}


لإرسال نموذج، استخدم FormUrlEncodedContent.



var formData = new Dictionary<string, string>{    { "username", "admin" },    { "password", "secret" }};var content = new FormUrlEncodedContent(formData);HttpResponseMessage response = await SharedClient.PostAsync("/login", content);


طلبات PUT و DELETE



يتم التحديث والحذف بطريقة مماثلة:



// PUTvar updateData = new { id = 1, name = "اسم محدث" };HttpResponseMessage putR                

المدونات

توصيات الكتب