عميل HTTP بلغة C#: إرسال الطلبات بشكل صحيح

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

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

ابدأ الدورة
```html

مقدمة: لماذا تحتاج إلى عميل HTTP صحيح في C#

في التطوير الحديث على منصة .NET، لا يكاد أي تطبيق يستغني عن التفاعل مع الخوادم البعيدة. سواء كان ذلك للحصول على بيانات من REST API، أو إرسال نماذج إلى خادم ويب، أو تحميل الملفات — كل هذا يتطلب تنفيذًا صحيحًا لطلبات HTTP. في C#، توجد عدة طرق، لكن الأكثر حداثة وتوصية هو الفئة HttpClient من مساحة الأسماء System.Net.Http. في هذه المقالة، سنشرح كيفية إنشاء عميل HTTP بشكل صحيح في C#، وتجنب الأخطاء الشائعة، وكتابة كود فعال.

الفئات الأساسية للعمل مع HTTP في C# (.NET)

قبل الانتقال إلى الأمثلة، من المهم فهم الأدوات التي توفرها منصة .NET. الفئات الأساسية:

  • HttpClient — الفئة الرئيسية لإرسال الطلبات واستلام الردود. يجب استخدامها كـ singleton (مثيل واحد للتطبيق بأكمله).
  • HttpRequestMessage — تسمح بتخصيص الطلب بالتفصيل: الطريقة، الرؤوس، الجسم، إصدار البروتوكول.
  • HttpResponseMessage — تحتوي على الرد من الخادم: الحالة، الرؤوس، الجسم.
  • HttpContent — الفئة الأساسية لتمثيل جسم الطلب أو الرد (مثل StringContent، ByteArrayContent، MultipartFormDataContent).

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

إعداد HttpClient: مثال أساسي

لننظر إلى إعداد بسيط. سننشئ مثيلًا من HttpClient ونحدد العنوان الأساسي:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class ApiService
{
    private static readonly HttpClient client = new HttpClient();

    public ApiService()
    {
        client.BaseAddress = new Uri("https://api.example.com/");
        client.DefaultRequestHeaders.Add("User-Agent", "C# HttpClient App");
        client.DefaultRequestHeaders.Accept.Add(
            new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<string> GetDataAsync(string endpoint)
    {
        HttpResponseMessage response = await client.GetAsync(endpoint);
        response.EnsureSuccessStatusCode(); // سيرمي استثناءً في حالة الخطأ
        return await response.Content.ReadAsStringAsync();
    }
}

لاحظ استخدام response.EnsureSuccessStatusCode() — هذه طريقة بسيطة للتحقق من نجاح الطلب (رمز 2xx).

أمثلة عملية لطلبات HTTP في C#

الآن ننتقل إلى سيناريوهات محددة. سننظر في طلبات GET و POST، بالإضافة إلى العمل مع الرؤوس ومعالجة الأخطاء.

1. طلب GET مع معاملات

لتمرير المعاملات في سلسلة الاستعلام، يمكن استخدام مجموعة QueryHelpers من Microsoft.AspNetCore.WebUtilities أو ببساطة تكوين URL يدويًا. فيما يلي مثال مع التكوين اليدوي:

public async Task<string> SearchUsersAsync(string name, int page)
{
    var query = $"/users?name={Uri.EscapeDataString(name)}&page={page}";
    HttpResponseMessage response = await client.GetAsync(query);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}

استخدم دائمًا Uri.EscapeDataString() لتشفير المعاملات لتجنب الأخطاء مع الأحرف الخاصة.

2. طلب POST مع جسم JSON

لإرسال البيانات بتنسيق JSON، من المناسب استخدام مكتبة System.Text.Json (أو Newtonsoft.Json). سنحول الكائن إلى JSON ونرسله:

using System.Text;
using System.Text.Json;

public async Task<bool> CreateUserAsync(User user)
{
    var json = JsonSerializer.Serialize(user);
    var content = new StringContent(json, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await client.PostAsync("/users", content);
    return response.IsSuccessStatusCode;
}

تأكد من تحديد نوع المحتوى الصحيح (application/json) في رأس الطلب.

```

المدونات

توصيات الكتب