Refit C# (.NET): دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

Refit في C# (.NET): عميل REST آمن الأنواع

1. ما هي Refit ولماذا تحتاجها؟

Refit هي مكتبة مفتوحة المصدر لمنصة .NET تقوم تلقائياً بإنشاء تطبيقات HTTP Client بناءً على واجهات (Interfaces) يحددها المطور. تتيح لك تحويل واجهة C# عادية إلى عميل REST متكامل، مما يوفر عليك كتابة الكود المتكرر لتنفيذ طلبات HTTP، وتحويل JSON من وإلى الكائنات، ومعالجة الأخطاء.

المشكلة الأساسية التي تحلها Refit هي تكرار الكود عند التعامل مع REST API. بدلاً من إنشاء دالة منفصلة لكل نقطة نهاية (Endpoint) مع HttpClient، وإعداد الرؤوس (Headers)، ومعالجة الردود والاستثناءات، يقوم المطور فقط بتعريف واجهة مع دوال مزينة بخصائص (Attributes) من Refit. المكتبة تقوم بإنشاء التطبيق تلقائياً باستخدام HttpClientFactory (الطريقة الموصى بها) أو مباشرة باستخدام HttpClient.

Refit مفيدة بشكل خاص في تطوير بنية الخدمات المصغرة (Microservices)، والتكامل مع APIs خارجية (مثل GitHub، Stripe، Telegram)، وفي أي مشروع يتطلب تفاعلاً آمناً من حيث الأنواع مع خدمات HTTP. تدعم جميع طرق HTTP الرئيسية (GET, POST, PUT, DELETE, PATCH)، والتعامل مع الرؤوس، ومعاملات الاستعلام (Query Parameters)، ونص الطلب (Request Body)، والنماذج متعددة الأجزاء (Multipart Forms)، والملفات.

2. التثبيت

يتم توزيع Refit عبر NuGet. للتثبيت، استخدم أحد الأوامر التالية:

# عبر .NET CLI
dotnet add package Refit

# عبر Package Manager Console (في Visual Studio)
Install-Package Refit

# أو عبر NuGet Package Manager في بيئة التطوير

للعمل مع الدوال غير المتزامنة والتكامل مع ASP.NET Core، يُوصى أيضاً بتثبيت الحزمة Refit.HttpClientFactory:

dotnet add package Refit.HttpClientFactory

إذا كنت تستخدم System.Text.Json (الافتراضي في .NET Core 3.1+)، فلن تحتاج إلى حزم إضافية. لاستخدام Newtonsoft.Json، قم بتثبيت Refit.Newtonsoft.Json.

3. بداية سريعة — مثال عملي بسيط

لنقم بإنشاء عميل بسيط لجلب البيانات من JSONPlaceholder (API REST اختباري).

الخطوة 1: تعريف نموذج البيانات:

public class Todo
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Title { get; set; }
    public bool Completed { get; set; }
}

الخطوة 2: إنشاء واجهة مع خصائص Refit:

using Refit;

public interface ITodoApi
{
    [Get("/todos/{id}")]
    Task<Todo> GetTodoAsync(int id);

    [Get("/todos")]
    Task<List<Todo>> GetAllTodosAsync();
}

الخطوة 3: استخدام Refit لإنشاء العميل:

using Refit;

class Program
{
    static async Task Main(string[] args)
    {
        // إنشاء العميل مباشرة (بدون حقن التبعية)
        var todoApi = RestService.For<ITodoApi>("https://jsonplaceholder.typicode.com");
        
        // جلب عنصر Todo واحد
        var todo = await todoApi.GetTodoAsync(1);
        Console.WriteLine($"Todo: {todo.Title}, Completed: {todo.Completed}");
        
        // جلب جميع عناصر Todo
        var todos = await todoApi.GetAllTodosAsync();
        Console.WriteLine($"Total todos: {todos.Count}");
    }
}

يوضح هذا المثال الآلية الأساسية: تقوم بتعريف واجهة، وتقوم Refit بإنشاء التطبيق الذي ينفذ طلبات HTTP ويفك تشفير الردود.

4. الدوال/الفئات الأساسية

4.1. RestService.For<T>()

التوقيع: public static T For<T>

توصيات