HTTP Client Module¶
The HTTP Client module generates typed HTTP clients from annotated partial classes — producing a complete effects-native pipeline: client implementation, interface, capability interface, Eff-wrapped effects module, test client, and DI registration.
Quick Start¶
using Deepstaging.HttpClient;
[HttpClient<ApiConfig>(BaseAddress = "https://api.example.com")]
[BearerAuth]
public partial class UsersClient
{
[Get("/users/{id}")]
public partial Task<User> GetUser(int id);
[Post("/users")]
public partial Task<User> CreateUser([Body] CreateUserRequest request);
[Get("/users")]
public partial Task<List<User>> ListUsers(
[Query] int page,
[Query("per_page")] int perPage,
[Header("X-Request-Id")] string requestId);
[Delete("/users/{id}")]
public partial Task<Unit> DeleteUser(int id);
}
The generator produces:
- Client implementation —
HttpClient-backed methods with JSON or form-encoded serialization IUsersClientinterface — for dependency injection and testingIHasUsersClientcapability — runtime capability interface for effects compositionUsersClientEffects— Eff-wrapped methods with activity tracing and error mappingTestUsersClient— test double with call recording and configurable responsesUsersClientRegistration— DI registration withIHttpClientFactory
STJ Source-Generated Serialization¶
Pass a JsonSerializerContext type to use source-generated JSON serialization:
[HttpClient(JsonContext = typeof(AppJsonContext))]
public partial class OrderClient
{
[Get("/api/orders/{id}")]
public partial Task<OrderDto> GetOrder(int id);
}
The generated client uses AppJsonContext.Default.Options for all JSON serialization and deserialization.
Learn More¶
| Page | Description |
|---|---|
| Attributes | [HttpClient], HTTP verbs, parameter and auth attributes |
| Generated Code | Interfaces, request types, capability, effects, DI registration |
| Effects | Effects-native HTTP calls with activity tracing |
| Testing | Test clients with call recording |
| Authentication | [BearerAuth], [ApiKeyAuth], [BasicAuth] configuration |
Diagnostics¶
| ID | Severity | Description |
|---|---|---|
| DSHTTP01 | Error | HttpClient class must be partial |
| DSHTTP02 | Error | HTTP method must be partial |
| DSHTTP04 | Error | HTTP path must not be empty |
| DSHTTP05 | Error | [Form] and [Body] cannot be combined on the same method |