Skip to content

Architecture Overview ​

WebApiClientCore is a declarative HTTP client framework for .NET that allows you to define HTTP requests through interfaces and attributes, eliminating the need to manually construct HttpRequestMessage.

Core Design Philosophy ​

Declarative Programming ​

Traditional HTTP client code:

csharp
// Traditional approach
public async Task<User> GetUserAsync(string id)
{
    var client = _httpClientFactory.CreateClient();
    var response = await client.GetAsync($"http://api.example.com/users/{id}");
    response.EnsureSuccessStatusCode();
    var json = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<User>(json);
}

Using WebApiClientCore:

csharp
// Declarative
public interface IUserApi
{
    [HttpGet("users/{id}")]
    Task<User> GetAsync(string id);
}

Core Concepts ​

Core Components ​

1. Attribute System ​

Attribute CategoryDescriptionExamples
HTTP MethodsDefine request method and path[HttpGet], [HttpPost]
Content AttributesDefine request body format[JsonContent], [FormContent]
Return AttributesDefine response parsing method[JsonReturn], [XmlReturn]
FiltersRequest/response interception[LoggingFilter], [Timeout]
Host AttributesDefine base URL[HttpHost]

2. IApiParameter ​

Self-describing parameter types that allow parameters to control their own serialization and transmission:

csharp
public class FaceModel : IApiParameter
{
    public Bitmap Image { get; set; }
    
    public Task OnRequestAsync(ApiParameterContext context)
    {
        // Custom serialization logic
    }
}

3. IApiFilter ​

Filters for request and response interception:

csharp
public class SignFilter : IApiFilter
{
    public Task OnRequestAsync(ApiRequestContext context)
    {
        // Before request: Add signature
    }
    
    public Task OnResponseAsync(ApiResponseContext context)
    {
        // After response: Log
    }
}

4. ITask<T> ​

Asynchronous tasks with conditional retry support:

csharp
public interface IUserApi
{
    [HttpGet("users/{id}")]
    ITask<User> GetAsync(string id);
}

var user = await userApi.GetAsync(id)
    .Retry(3)
    .WhenCatch<HttpRequestException>();

Request Processing Flow ​

Dependency Injection ​

WebApiClientCore integrates deeply with ASP.NET Core's dependency injection system:

csharp
// Register interface
services.AddHttpApi<IUserApi>()
    .ConfigureHttpApi(o =>
    {
        o.HttpHost = new Uri("http://api.example.com/");
    })
    .ConfigureHttpClient(c =>
    {
        c.Timeout = TimeSpan.FromSeconds(30);
    });

// Usage
public class UserService
{
    private readonly IUserApi _userApi;
    
    public UserService(IUserApi userApi)
    {
        _userApi = userApi;
    }
}

Extension Packages ​

Package NameFunction
WebApiClientCoreCore package
WebApiClientCore.Extensions.OAuthsOAuth2 and token management
WebApiClientCore.Extensions.NewtonsoftJsonNewtonsoft.Json support
WebApiClientCore.Extensions.JsonRpcJSON-RPC protocol support
WebApiClientCore.OpenApi.SourceGeneratorOpenAPI code generation tool

Comparison with Other Solutions ​

FeatureWebApiClientCoreRefitHttpClient
Declarative Interface✅✅❌
Compile-time Checking✅✅❌
Conditional Retry✅ ITask❌❌
Custom Parameter Serialization✅ IApiParameter❌✅
OAuth Extension✅Manual implementationManual implementation
AOT Support✅❌✅

Next Steps ​