RestSharp

About RestSharp: A popular REST and HTTP API Client library for .NET

RestSharp Repo stars is one of the most popular and widely-used REST client libraries in the .NET ecosystem.

InfoLink
LicenseGitHub
DownloadsNuget
Latest VersionGitHub release (latest by date)
IssuesGitHub issues
ContributorsGitHub contributors

RestSharp is a lightweight yet powerful HTTP client library designed specifically for consuming REST APIs in .NET applications. The library provides a simple, fluent interface for making HTTP requests while handling common REST tasks like serialization/deserialization, authentication, and parameter handling.\

Unlike code-generation approaches, RestSharp follows a manual, request-building pattern that gives developers fine-grained control over their API interactions. Its programming model strikes a balance between the low-level flexibility of HttpClient and the convenience of specialized REST operations.

Key Features

  • Simple and intuitive API: Easy to learn and use with minimal boilerplate code
  • Automatic serialization/deserialization: Supports JSON, XML, and custom formatters
  • Authentication support: Handles OAuth, Basic, JWT, and custom authentication schemes
  • Request/response interception: Customize request/response processing with middleware-like handlers
  • Parametrized requests: Supports URL parameters, query strings, headers, and request body
  • Configurable defaults: Set timeout, user agent, headers and other settings at the client level
  • File uploads/downloads: Built-in support for multipart form data and file operations
  • Retry policies: Automatic retries with configurable backoff strategies

Basic Usage Sample

// Create options
RestClientOptions options = new RestClientOptions("https://api.example.com")
{
    ThrowOnAnyError = true,
    Timeout = 30
};

// Create client
RestClient client = new RestClient(options);

// Get single task
{
    RestRequest request = new RestRequest("tasks/1234");
    TaskApiModel? task = await client.GetAsync<TaskApiModel>(request, cancellationToken);
}

// Get all tasks
{
    RestRequest request = new RestRequest("tasks");
    TaskApiModel[]? tasks = await client.GetAsync<TaskApiModel[]>(request, cancellationToken);
}

// Add new task
{    TaskApiCreateModel newTask = new TaskApiCreateModel { Title = "Buy flowers" };
    RestRequest request = new RestRequest("tasks").AddJsonBody(newTask);
    TaskApiModel? createdTask = await client.PostAsync<TaskApiModel?>(request, cancellationToken);
}

API Client Pattern

While RestSharp is easy to use directly, it’s considered a best practice to encapsulate RestSharp calls within a dedicated API client class. This abstraction provides several benefits:

  1. Centralized configuration: Manage base URL, authentication, and default headers in one place
  2. Domain-specific methods: Create methods that map directly to your business operations
  3. Consistent error handling: Implement standardized error processing across all API calls
  4. Testability: Easily mock the API client in unit tests
  5. Implementation hiding: Shield application code from HTTP-specific details
/*** Wrapper Sample ***/

public class MyTaskApiClient
{
    private readonly RestClient _client;

    public MyTaskApiClient(string baseUrl)
    {
        _client = new RestClient(baseUrl);
    }

    public Task<TaskApiModel?> GetTask(int id, CancellationToken cancellationToken = default)
        => _client.GetAsync<TaskApiModel>(new RestRequest($"task/{id}"), cancellationToken);

    public Task<List<TaskApiModel>?> GetAllTasks(CancellationToken cancellationToken = default) =>
        _client.GetAsync<List<TaskApiModel>>(new RestRequest("tasks"), cancellationToken);    public Task<TaskApiModel?> AddTask(string title, CancellationToken cancellationToken = default)
    {
        TaskApiCreateModel newTask = new TaskApiCreateModel { Title = title };
        RestRequest request = new RestRequest("tasks").AddJsonBody(newTask);
        return _client.PostAsync<TaskApiModel>(request, cancellationToken);
    }

    public Task<bool> DeleteTask(int id, CancellationToken cancellationToken = default)
    {
        RestRequest request = new RestRequest($"tasks/{id}");
        return _client.DeleteAsync(request, cancellationToken)
            .ContinueWith(t => t.IsCompletedSuccessfully, cancellationToken);
    }
}

Advanced Features

Authentication

// Basic authentication
client.Authenticator = new HttpBasicAuthenticator("username", "password");

// OAuth2 bearer token
client.Authenticator = new JwtAuthenticator("your-access-token");

// API key in header
client.AddDefaultHeader("X-API-Key", "your-api-key");

Request Configuration

var request = new RestRequest("resource")
    .AddQueryParameter("page", "1")
    .AddQueryParameter("sort", "desc")
    .AddHeader("Accept-Language", "en-US")
    .AddJsonBody(new { name = "value" });

File Uploads

var request = new RestRequest("upload");
request.AddFile("file", "/path/to/file.pdf", "application/pdf");
await client.PostAsync(request);

Comparison

Pros

  • Mature, well-tested library with active community support
  • Intuitive API with excellent documentation
  • Flexible serialization options with minimal configuration
  • Works well with simple to moderately complex API integrations
  • No code generation required - ideal for quick prototyping

Cons

  • Higher memory allocation compared to more optimized HTTP clients
  • API client wrapper implementation required for production applications
  • Limited support for advanced API scenarios (e.g., GraphQL, streaming)
  • No built-in request caching mechanism

Full Sample

See the full sample on GitHub: https://github.com/BenjaminAbt/dotnet.rest-samples