7.1流变对象 Clay
这里汇总了流变对象在应用开发中的常见案例。
应用案例#
这里汇总了流变对象在应用开发中的常见案例。
使用流变对象 Clay 构建和接收请求数据#
流变对象(Clay)在 HTTP 远程请求中的应用场景非常广泛,尤其是在与第三方 API 接口对接时。通常,这些接口需要传递或接收 JSON 格式的数据,而流变对象可以简化数据的构建和解析过程。以下是如何在 HTTP 远程请求模块中使用流变对象的配置步骤:
1. 配置流变对象 JSON 序列化转换器#
在使用流变对象进行 HTTP 远程请求时,首先需要配置 AddClayConverters(),以便将流变对象序列化为 JSON 格式字符串。配置示例如下:
// 全局配置(适用于所有客户端)services.AddHttpRemote(options => {}) .ConfigureOptions(options => { options.JsonSerializerOptions.AddClayConverters(); });// 客户端级配置(优先级更高)services.AddHttpClient("客户端名称") .ConfigureOptions(options => { options.JsonSerializerOptions.AddClayConverters(); });2. 发送和接收 JSON 数据#
配置完成后,可以使用流变对象构建请求内容并发送 HTTP 请求,同时将响应内容转换为流变对象进行处理。以下是一个示例:
// 构建请求内容dynamic payload = new Clay();payload.id = 1;payload.name = "furion";// 发送 HTTP 远程请求var content = await httpRemoteService.PostAsStringAsync("https://localhost:7044/HttpRemote/AddModel", builder => builder.SetJsonContent(payload));// 将响应内容转化为流变对象dynamic clay = Clay.Parse(content);自定义 Clay 内容转换器简化手动转换 ✅#
为了简化代码,避免手动将 JSON 格式字符串转换为流变对象(如 dynamic clay = Clay.Parse(content);),可以自定义 ClayContentConverter 内容转换器。通过这种方式,您可以直接在 HTTP 请求中使用 Clay 类型作为泛型接收参数。以下是自定义转换器的实现:
【一键下载 ClayContentConverter.cs 文件】✅
public class ClayContentConverter : HttpContentConverterBase<Clay>{ /// <inheritdoc /> public override Clay? Read(HttpContentConverterContext context, CancellationToken cancellationToken = default) => AsyncUtility.RunSync(() => ReadAsync(context, cancellationToken)); /// <inheritdoc /> public override async Task<Clay?> ReadAsync(HttpContentConverterContext context, CancellationToken cancellationToken = default) { var str = await context.ResponseMessage.Content.ReadAsStringAsync(cancellationToken); return Clay.Parse(str, ClayOptions.Flexible); // 或使用 Clay.Parse(str, ClayOptions.Flexible); // 忽略属性大小写 }}// 支持 dynamic 类型转流变对象(可选,但推荐!!!)public class DynamicContentConverter : HttpContentConverterBase<dynamic>{ /// <inheritdoc /> public override dynamic? Read(HttpContentConverterContext context, CancellationToken cancellationToken = default) => AsyncUtility.RunSync(() => ReadAsync(context, cancellationToken)); /// <inheritdoc /> public override async Task<dynamic?> ReadAsync(HttpContentConverterContext context, CancellationToken cancellationToken = default) { var str = await context.ResponseMessage.Content.ReadAsStringAsync(cancellationToken); return Clay.Parse(str, ClayOptions.Flexible); // 或使用 Clay.Parse(str, ClayOptions.Flexible); // 忽略属性大小写 }}随后,在 Startup.cs 或 Program.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义内容转换器功能:
services.AddHttpRemote(options =>{ options.AddHttpContentConverters(() => [ new ClayContentConverter(), new DynamicContentConverter()]); // new DynamicContentConverter()(可选,但推荐!!)});配置完成后,可以直接使用流变对象类型 Clay 作为泛型接收参数:
// 发送 HTTP 远程请求,将响应内容转化为流变对象dynamic clay = await httpRemoteService.PostAsAsync<Clay>("https://localhost:7044/HttpRemote/AddModel", builder => builder.SetJsonContent(payload));// 如果配置了 DynamicContentConverter,那么也可以使用 dynamic 接收dynamic clay = await httpRemoteService.PostAsAsync<dynamic>("https://localhost:7044/HttpRemote/AddModel", builder => builder.SetJsonContent(payload));通过结合流变对象与 HTTP 远程请求,开发者可以更高效地处理动态 JSON 数据,简化第三方 API 的对接流程。流变对象的动态特性使得数据的构建和解析更加灵活,同时自定义内容转换器进一步提升了开发效率。