Getting Started

Get up and running with WebSpark.HttpClientUtility in minutes.

Installation

Install via NuGet Package Manager:

dotnet add package WebSpark.HttpClientUtility

Or via Package Manager Console:

Install-Package WebSpark.HttpClientUtility

Basic Setup

Step 1: Register Services

In your Program.cs or Startup.cs:

using WebSpark.HttpClientUtility;

var builder = WebApplication.CreateBuilder(args);

// Basic registration
builder.Services.AddHttpClientUtility();

var app = builder.Build();

Step 2: Inject and Use

using WebSpark.HttpClientUtility.RequestResult;

public class WeatherService
{
    private readonly IHttpRequestResultService _httpService;

    public WeatherService(IHttpRequestResultService httpService)
    {
        _httpService = httpService;
    }

    public async Task<WeatherData?> GetWeatherAsync(string city)
    {
        var request = new HttpRequestResult<WeatherData>
        {
            RequestPath = $"https://api.weather.com/v1/current/{city}",
            RequestMethod = HttpMethod.Get
        };

        var result = await _httpService.HttpSendRequestResultAsync(request);

        if (result.IsSuccessStatusCode)
        {
            return result.ResponseResults;
        }

        return null;
    }
}

Enable Optional Features

Caching

builder.Services.AddHttpClientUtility(options => {
    options.EnableCaching = true;
});

Use caching in requests:

var request = new HttpRequestResult<WeatherData>
{
    RequestPath = "https://api.weather.com/v1/current/seattle",
    RequestMethod = HttpMethod.Get,
    CacheDurationMinutes = 15 // Cache for 15 minutes
};

Resilience (Retry & Circuit Breaker)

builder.Services.AddHttpClientUtility(options => {
    options.EnableResilience = true;
    options.ResilienceOptions.MaxRetryAttempts = 3;
    options.ResilienceOptions.RetryDelay = TimeSpan.FromSeconds(1);
});

Telemetry

using WebSpark.HttpClientUtility.OpenTelemetry;

builder.Services.AddHttpClientUtility(options => {
    options.EnableTelemetry = true;
});

builder.Services.AddWebSparkOpenTelemetry(tracerBuilder => {
    tracerBuilder.AddOtlpExporter();
});

All Features Enabled

Quick setup with everything enabled:

builder.Services.AddHttpClientUtilityWithAllFeatures();

Working with Requests

POST Request with JSON

var request = new HttpRequestResult<UserResponse>
{
    RequestPath = "https://api.example.com/users",
    RequestMethod = HttpMethod.Post,
    RequestBody = new { Name = "John Doe", Email = "john@example.com" }
};

var result = await _httpService.HttpSendRequestResultAsync(request);

Adding Headers

var request = new HttpRequestResult<Data>
{
    RequestPath = "https://api.example.com/data",
    RequestMethod = HttpMethod.Get,
    RequestHeaders = new Dictionary<string, string>
    {
        { "Accept", "application/json" },
        { "X-Custom-Header", "value" }
    }
};

Authentication

using WebSpark.HttpClientUtility.Authentication;

var request = new HttpRequestResult<Data>
{
    RequestPath = "https://api.example.com/secure/data",
    RequestMethod = HttpMethod.Get,
    AuthenticationProvider = new BearerTokenAuthenticationProvider("your-token")
};

Handling Responses

Check Status

var result = await _httpService.HttpSendRequestResultAsync(request);

if (result.IsSuccessStatusCode)
{
    var data = result.ResponseResults;
    Console.WriteLine($"Success: {data}");
}
else
{
    Console.WriteLine($"Error {result.StatusCode}: {result.ResponseContent}");
}

Access Response Details

var result = await _httpService.HttpSendRequestResultAsync(request);

Console.WriteLine($"Status Code: {result.StatusCode}");
Console.WriteLine($"Duration: {result.RequestDuration}ms");
Console.WriteLine($"Correlation ID: {result.CorrelationId}");
Console.WriteLine($"Response Headers: {result.ResponseHeaders}");

Configuration Options

Complete Configuration Example

builder.Services.AddHttpClientUtility(options =>
{
    // Enable features
    options.EnableCaching = true;
    options.EnableResilience = true;
    options.EnableTelemetry = true;

    // Resilience settings
    options.ResilienceOptions.MaxRetryAttempts = 5;
    options.ResilienceOptions.RetryDelay = TimeSpan.FromSeconds(2);
    options.ResilienceOptions.CircuitBreakerThreshold = 10;
    options.ResilienceOptions.CircuitBreakerDuration = TimeSpan.FromMinutes(1);

    // Cache settings are per-request via CacheDurationMinutes
});

Testing Your Code

Use the mock service for unit tests:

using WebSpark.HttpClientUtility.MockService;

[TestMethod]
public async Task TestWeatherService()
{
    // Arrange
    var mockResponse = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(
            "{\"temperature\":72,\"condition\":\"Sunny\"}",
            Encoding.UTF8,
            "application/json"
        )
    };

    var mockService = new MockHttpRequestResultService<WeatherData>(mockResponse);
    var weatherService = new WeatherService(mockService);

    // Act
    var weather = await weatherService.GetWeatherAsync("seattle");

    // Assert
    Assert.IsNotNull(weather);
    Assert.AreEqual(72, weather.Temperature);
}

Common Patterns

Retry Failed Requests Automatically

Resilience is enabled - just make the request:

// Will automatically retry on transient failures
var result = await _httpService.HttpSendRequestResultAsync(request);

Cache API Responses

// First call hits the API
var result1 = await _httpService.HttpSendRequestResultAsync(request);

// Second call within cache duration returns cached data
var result2 = await _httpService.HttpSendRequestResultAsync(request);

Track Request Performance

var result = await _httpService.HttpSendRequestResultAsync(request);
Console.WriteLine($"Request took {result.RequestDuration}ms");

Next Steps

Need Help?