Examples

Practical examples for common scenarios.

Basic HTTP Requests

Simple GET Request

var request = new HttpRequestResult<UserProfile>
{
    RequestPath = "https://api.example.com/users/123",
    RequestMethod = HttpMethod.Get
};

var result = await _httpService.HttpSendRequestResultAsync(request);

if (result.IsSuccessStatusCode)
{
    var user = result.ResponseResults;
    Console.WriteLine($"User: {user.Name}, Email: {user.Email}");
}

POST Request with JSON Body

var newUser = new CreateUserRequest
{
    Name = "Jane Doe",
    Email = "jane@example.com",
    Role = "Developer"
};

var request = new HttpRequestResult<UserResponse>
{
    RequestPath = "https://api.example.com/users",
    RequestMethod = HttpMethod.Post,
    RequestBody = newUser
};

var result = await _httpService.HttpSendRequestResultAsync(request);
Console.WriteLine($"Created user with ID: {result.ResponseResults.Id}");

PUT Request (Update)

var updateData = new UpdateUserRequest
{
    Name = "Jane Smith",
    Email = "jane.smith@example.com"
};

var request = new HttpRequestResult<UserResponse>
{
    RequestPath = "https://api.example.com/users/123",
    RequestMethod = HttpMethod.Put,
    RequestBody = updateData
};

var result = await _httpService.HttpSendRequestResultAsync(request);

DELETE Request

var request = new HttpRequestResult<object>
{
    RequestPath = "https://api.example.com/users/123",
    RequestMethod = HttpMethod.Delete
};

var result = await _httpService.HttpSendRequestResultAsync(request);

if (result.IsSuccessStatusCode)
{
    Console.WriteLine("User deleted successfully");
}

Authentication Examples

Bearer Token Authentication

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

var result = await _httpService.HttpSendRequestResultAsync(request);

Basic Authentication

var request = new HttpRequestResult<Data>
{
    RequestPath = "https://api.example.com/data",
    RequestMethod = HttpMethod.Get,
    AuthenticationProvider = new BasicAuthenticationProvider("username", "password")
};

API Key Authentication

var request = new HttpRequestResult<Data>
{
    RequestPath = "https://api.example.com/data",
    RequestMethod = HttpMethod.Get,
    AuthenticationProvider = new ApiKeyAuthenticationProvider("X-API-Key", "your-api-key-here")
};

Caching Examples

Cache API Response

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

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

// Second call within 30 minutes - returns cached data
var result2 = await _httpService.HttpSendRequestResultAsync(request);

Different Cache Durations

// Frequently changing data - short cache
var realtimeRequest = new HttpRequestResult<StockPrice>
{
    RequestPath = "https://api.stocks.com/price/MSFT",
    CacheDurationMinutes = 1
};

// Rarely changing data - long cache
var configRequest = new HttpRequestResult<AppConfig>
{
    RequestPath = "https://api.example.com/config",
    CacheDurationMinutes = 1440 // 24 hours
};

Error Handling

Handle Different Status Codes

var result = await _httpService.HttpSendRequestResultAsync(request);

switch (result.StatusCode)
{
    case HttpStatusCode.OK:
        var data = result.ResponseResults;
        Console.WriteLine($"Success: {data}");
        break;
    
    case HttpStatusCode.NotFound:
        Console.WriteLine("Resource not found");
        break;
    
    case HttpStatusCode.Unauthorized:
        Console.WriteLine("Authentication required");
        break;
    
    case HttpStatusCode.BadRequest:
        Console.WriteLine($"Bad request: {result.ResponseContent}");
        break;
    
    default:
        Console.WriteLine($"Error {result.StatusCode}: {result.ResponseContent}");
        break;
}

Resilience with Automatic Retry

// With resilience enabled, this will automatically retry on transient failures
builder.Services.AddHttpClientUtility(options => {
    options.EnableResilience = true;
    options.ResilienceOptions.MaxRetryAttempts = 3;
    options.ResilienceOptions.RetryDelay = TimeSpan.FromSeconds(2);
});

// Request will retry up to 3 times with 2 second delay
var result = await _httpService.HttpSendRequestResultAsync(request);

Advanced Examples

Custom Headers

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

Query String Parameters

var queryParams = new QueryStringParametersList
{
    { "page", "1" },
    { "pageSize", "50" },
    { "sort", "name" },
    { "filter", "active" }
};

var request = new HttpRequestResult<PagedResult<User>>
{
    RequestPath = $"https://api.example.com/users{queryParams.ToQueryString()}",
    RequestMethod = HttpMethod.Get
};

Correlation ID for Distributed Tracing

var request = new HttpRequestResult<Data>
{
    RequestPath = "https://api.example.com/data",
    RequestMethod = HttpMethod.Get,
    CorrelationId = Guid.NewGuid().ToString() // Auto-generated if not provided
};

var result = await _httpService.HttpSendRequestResultAsync(request);
Console.WriteLine($"Request tracked with ID: {result.CorrelationId}");

Concurrent Requests

using WebSpark.HttpClientUtility.Concurrent;

var requests = new List<HttpRequestResult<Data>>
{
    new() { RequestPath = "https://api.example.com/data/1", RequestMethod = HttpMethod.Get },
    new() { RequestPath = "https://api.example.com/data/2", RequestMethod = HttpMethod.Get },
    new() { RequestPath = "https://api.example.com/data/3", RequestMethod = HttpMethod.Get }
};

var results = await _concurrentService.ExecuteConcurrentRequestsAsync(requests);

foreach (var result in results)
{
    Console.WriteLine($"Path: {result.RequestPath}, Success: {result.IsSuccessStatusCode}");
}

Web Crawling Example

Basic Crawler Setup

using WebSpark.HttpClientUtility.Crawler;

var options = new CrawlerOptions
{
    BaseUrl = "https://example.com",
    MaxDepth = 3,
    MaxPages = 100,
    RespectRobotsTxt = true,
    UserAgent = "MyBot/1.0",
    DelayBetweenRequests = TimeSpan.FromMilliseconds(500)
};

var crawler = new SiteCrawler(options, _httpService, _logger);

crawler.PageCrawled += (sender, e) =>
{
    Console.WriteLine($"Crawled: {e.Url} - Status: {e.StatusCode}");
};

await crawler.CrawlAsync(cancellationToken);

Crawler with Progress Updates

var crawler = new SiteCrawler(options, _httpService, _logger);

crawler.CrawlProgress += (sender, progress) =>
{
    Console.WriteLine($"Progress: {progress.PagesProcessed}/{progress.TotalPages}");
    Console.WriteLine($"Success Rate: {progress.SuccessRate:P}");
};

await crawler.CrawlAsync(cancellationToken);

Testing Examples

Mock Successful Response

[TestMethod]
public async Task TestSuccessfulApiCall()
{
    // Arrange
    var expectedData = new UserData { Id = 1, Name = "Test User" };
    var mockResponse = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(
            JsonSerializer.Serialize(expectedData),
            Encoding.UTF8,
            "application/json"
        )
    };

    var mockService = new MockHttpRequestResultService<UserData>(mockResponse);
    var service = new MyService(mockService);

    // Act
    var result = await service.GetUserAsync(1);

    // Assert
    Assert.IsNotNull(result);
    Assert.AreEqual(expectedData.Name, result.Name);
}

Mock Error Response

[TestMethod]
public async Task TestApiError()
{
    // Arrange
    var mockResponse = new HttpResponseMessage(HttpStatusCode.NotFound)
    {
        Content = new StringContent("User not found")
    };

    var mockService = new MockHttpRequestResultService<UserData>(mockResponse);
    var service = new MyService(mockService);

    // Act
    var result = await service.GetUserAsync(999);

    // Assert
    Assert.IsNull(result);
}

Integration Examples

ASP.NET Core Controller

[ApiController]
[Route("api/[controller]")]
public class WeatherController : ControllerBase
{
    private readonly IHttpRequestResultService _httpService;

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

    [HttpGet("{city}")]
    public async Task<IActionResult> GetWeather(string city)
    {
        var request = new HttpRequestResult<WeatherData>
        {
            RequestPath = $"https://api.weather.com/v1/current/{city}",
            RequestMethod = HttpMethod.Get,
            CacheDurationMinutes = 15
        };

        var result = await _httpService.HttpSendRequestResultAsync(request);

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

        return StatusCode((int)result.StatusCode, result.ResponseContent);
    }
}

Background Service

public class DataSyncService : BackgroundService
{
    private readonly IHttpRequestResultService _httpService;
    private readonly ILogger<DataSyncService> _logger;

    public DataSyncService(
        IHttpRequestResultService httpService,
        ILogger<DataSyncService> logger)
    {
        _httpService = httpService;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                var request = new HttpRequestResult<SyncData>
                {
                    RequestPath = "https://api.example.com/sync",
                    RequestMethod = HttpMethod.Get
                };

                var result = await _httpService.HttpSendRequestResultAsync(request);

                if (result.IsSuccessStatusCode)
                {
                    _logger.LogInformation("Sync completed successfully");
                }
                else
                {
                    _logger.LogWarning($"Sync failed: {result.StatusCode}");
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Sync error");
            }

            await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
        }
    }
}

Next Steps