序列化
RestClient.Net 使用基于函数的序列化来实现最大灵活性。您可以完全控制请求和响应体的序列化方式。
请求序列化
`serializeRequest` 参数将请求对象转换为 `HttpContent`:
// 使用 System.Text.Json(推荐)
serializeRequest: body => JsonContent.Create(body)
// 使用自定义选项
serializeRequest: body => JsonContent.Create(body, options: new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
})
// 自定义媒体类型
serializeRequest: body => new StringContent(
JsonSerializer.Serialize(body),
Encoding.UTF8,
"application/vnd.api+json"
)
响应反序列化
`deserializeSuccess` 和 `deserializeError` 参数转换响应:
// 使用 System.Text.Json
deserializeSuccess: async (response, ct) =>
await response.Content.ReadFromJsonAsync<User>(ct)
// 使用自定义选项
deserializeSuccess: async (response, ct) =>
await response.Content.ReadFromJsonAsync<User>(
new JsonSerializerOptions { PropertyNameCaseInsensitive = true },
ct
)
// 自定义反序列化
deserializeSuccess: async (response, ct) =>
{
var json = await response.Content.ReadAsStringAsync(ct);
return MyCustomParser.Parse<User>(json);
}
常见模式
可复用的反序列化器
定义可复用的反序列化器以避免重复:
public static class Deserializers
{
public static async Task<T> Json<T>(
HttpResponseMessage response,
CancellationToken ct) =>
await response.Content.ReadFromJsonAsync<T>(ct)
?? throw new InvalidOperationException("空响应");
public static async Task<ErrorResponse> Error(
HttpResponseMessage response,
CancellationToken ct) =>
await response.Content.ReadFromJsonAsync<ErrorResponse>(ct)
?? new ErrorResponse("未知错误");
}
// 使用
var result = await httpClient.GetAsync(
url: "https://api.example.com/users/123".ToAbsoluteUrl(),
deserializeSuccess: Deserializers.Json<User>,
deserializeError: Deserializers.Error
);
处理空响应
对于不返回响应体的端点(如 DELETE):
// 返回一个标记值表示成功
deserializeSuccess: async (response, ct) => Unit.Value
// 或返回状态码
deserializeSuccess: async (response, ct) => response.StatusCode
二进制数据
对于文件下载或二进制响应:
deserializeSuccess: async (response, ct) =>
await response.Content.ReadAsByteArrayAsync(ct)
// 或作为流
deserializeSuccess: async (response, ct) =>
await response.Content.ReadAsStreamAsync(ct)
状态码处理
反序列化器接收完整的 `HttpResponseMessage`,因此您可以检查状态码:
deserializeSuccess: async (response, ct) =>
{
// 204 无内容
if (response.StatusCode == HttpStatusCode.NoContent)
return default(User);
return await response.Content.ReadFromJsonAsync<User>(ct);
}
错误响应类型
您的错误类型可以是任何类型:
// 简单字符串
deserializeError: async (response, ct) =>
await response.Content.ReadAsStringAsync(ct)
// 结构化错误
public record ApiError(string Code, string Message, string[] Details);
deserializeError: async (response, ct) =>
await response.Content.ReadFromJsonAsync<ApiError>(ct)
// Problem Details (RFC 7807)
deserializeError: async (response, ct) =>
await response.Content.ReadFromJsonAsync<ProblemDetails>(ct)