7.1流变对象 Clay

这里汇总了流变对象在应用开发中的常见案例。

应用案例#

这里汇总了流变对象在应用开发中的常见案例。

使用流变对象 Clay 构建和接收请求数据#

流变对象(Clay)在 HTTP 远程请求中的应用场景非常广泛,尤其是在与第三方 API 接口对接时。通常,这些接口需要传递或接收 JSON 格式的数据,而流变对象可以简化数据的构建和解析过程。以下是如何在 HTTP 远程请求模块中使用流变对象的配置步骤:

1. 配置流变对象 JSON 序列化转换器#

在使用流变对象进行 HTTP 远程请求时,首先需要配置 AddClayConverters(),以便将流变对象序列化为 JSON 格式字符串。配置示例如下:

cs
// 全局配置(适用于所有客户端)services.AddHttpRemote(options => {})    .ConfigureOptions(options =>    {        options.JsonSerializerOptions.AddClayConverters();    });// 客户端级配置(优先级更高)services.AddHttpClient("客户端名称")    .ConfigureOptions(options =>    {        options.JsonSerializerOptions.AddClayConverters();    });

2. 发送和接收 JSON 数据#

配置完成后,可以使用流变对象构建请求内容并发送 HTTP 请求,同时将响应内容转换为流变对象进行处理。以下是一个示例:

cs
// 构建请求内容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 文件】✅

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.csProgram.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义内容转换器功能:

cs
services.AddHttpRemote(options =>{    options.AddHttpContentConverters(() => [ new ClayContentConverter(), new DynamicContentConverter()]);   // new DynamicContentConverter()(可选,但推荐!!)});

配置完成后,可以直接使用流变对象类型 Clay 作为泛型接收参数:

cs
// 发送 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 的对接流程。流变对象的动态特性使得数据的构建和解析更加灵活,同时自定义内容转换器进一步提升了开发效率。