HttpClient 扩展方法

HttpClient 提供的扩展方法,返回 Result<TSuccess, HttpError<TError>> 而不是抛出异常。

GetAsync

发起类型安全的 GET 请求。

public static async Task<Result<TSuccess, HttpError<TError>>> GetAsync<TSuccess, TError>(
    this HttpClient httpClient,
    AbsoluteUrl url,
    Func<HttpContent, CancellationToken, Task<TSuccess>> deserializeSuccess,
    Func<HttpContent, CancellationToken, Task<TError>> deserializeError,
    CancellationToken cancellationToken = default
)

参数

参数 类型 描述
url AbsoluteUrl 请求的 URL(使用 .ToAbsoluteUrl() 扩展方法)
deserializeSuccess Func<HttpContent, CancellationToken, Task<TSuccess>> 反序列化成功响应的函数
deserializeError Func<HttpContent, CancellationToken, Task<TError>> 反序列化错误响应的函数
cancellationToken CancellationToken 可选的取消令牌

返回值

Task<Result<TSuccess, HttpError<TError>>> - 一个可辨识联合,可能是:

  • Ok<TSuccess> - 成功,包含反序列化的数据
  • Error<HttpError<TError>> - 错误,包含 ResponseErrorExceptionError

示例

var result = await httpClient.GetAsync(
    url: "https://api.example.com/users/1".ToAbsoluteUrl(),
    deserializeSuccess: DeserializeUser,
    deserializeError: DeserializeApiError
);

var output = result switch
{
    OkUser(var user) => $"找到: {user.Name}",
    ErrorUser(ResponseErrorUser(var err, var status, _)) => $"API 错误 {status}: {err.Message}",
    ErrorUser(ExceptionErrorUser(var ex)) => $"异常: {ex.Message}",
};

PostAsync

发起带请求体的类型安全 POST 请求。

public static async Task<Result<TSuccess, HttpError<TError>>> PostAsync<TRequest, TSuccess, TError>(
    this HttpClient httpClient,
    AbsoluteUrl url,
    TRequest body,
    Func<TRequest, HttpContent> serializeRequest,
    Func<HttpContent, CancellationToken, Task<TSuccess>> deserializeSuccess,
    Func<HttpContent, CancellationToken, Task<TError>> deserializeError,
    CancellationToken cancellationToken = default
)

参数

参数 类型 描述
url AbsoluteUrl 请求的 URL
body TRequest 请求体对象
serializeRequest Func<TRequest, HttpContent> 序列化请求体的函数
deserializeSuccess Func<HttpContent, CancellationToken, Task<TSuccess>> 反序列化成功响应的函数
deserializeError Func<HttpContent, CancellationToken, Task<TError>> 反序列化错误响应的函数
cancellationToken CancellationToken 可选的取消令牌

示例

var newUser = new CreateUserRequest("张三", "zhangsan@example.com");

var result = await httpClient.PostAsync(
    url: "https://api.example.com/users".ToAbsoluteUrl(),
    body: newUser,
    serializeRequest: SerializeJson,
    deserializeSuccess: DeserializeUser,
    deserializeError: DeserializeApiError
);

PutAsync

发起类型安全的 PUT 请求。签名与 PostAsync 相同,用于更新现有资源。


DeleteAsync

发起类型安全的 DELETE 请求。签名与 GetAsync 相同,用于删除资源。


PatchAsync

发起类型安全的 PATCH 请求。签名与 PostAsync 相同,用于部分更新。


与 IHttpClientFactory 配合使用

RestClient.NetIHttpClientFactory 无缝集成,实现正确的连接池管理:

// 在 Program.cs 中
builder.Services.AddHttpClient("api", client =>
{
    client.BaseAddress = new Uri("https://api.example.com");
    client.DefaultRequestHeaders.Add("Accept", "application/json");
});

// 在您的服务中
public class UserService(IHttpClientFactory factory)
{
    public async Task<Result<User, HttpError<ApiError>>> GetUserAsync(int id)
    {
        var client = factory.CreateClient("api");
        return await client.GetAsync(
            url: $"/users/{id}".ToAbsoluteUrl(),
            deserializeSuccess: DeserializeUser,
            deserializeError: DeserializeApiError
        );
    }
}