You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求指导:将CloudFlare缓存清除请求的Files转为C#嵌套模型类

如何为Cloudflare缓存清除API构建C#嵌套模型类

咱们先拆解一下你提供的Cloudflare API请求里的files数组结构:它是混合类型数组——既包含纯字符串URL,又包含带url和headers的复杂对象。在C#这种强类型语言里,我们需要用一些技巧来处理这种混合场景,下面是两种可行的方案:

方案1:使用object类型数组(快速实现)

如果只是快速落地需求,不想写额外的自定义逻辑,可以直接用object[]来容纳两种类型的元素,依赖JSON序列化库(比如System.Text.Json或Newtonsoft.Json)自动处理类型转换:

// 根请求类,对应API的顶层结构
public class CachePurgeRequest
{
    // System.Text.Json用[JsonPropertyName],Newtonsoft.Json用[JsonProperty]
    [JsonPropertyName("files")]
    public object[] Files { get; set; }
}

// 带Headers的文件对象类
public class PurgeFileWithHeaders
{
    [JsonPropertyName("url")]
    public string Url { get; set; }

    [JsonPropertyName("headers")]
    public PurgeHeaders Headers { get; set; }
}

// 对应文件的Headers结构
public class PurgeHeaders
{
    [JsonPropertyName("Origin")]
    public string Origin { get; set; }

    [JsonPropertyName("CF-IPCountry")]
    public string CfIpCountry { get; set; }

    [JsonPropertyName("CF-Device-Type")]
    public string CfDeviceType { get; set; }
}

使用示例

// 构建请求实例
var purgeRequest = new CachePurgeRequest
{
    Files = new object[]
    {
        "http://www.example.com/css/styles.css", // 直接传入纯URL字符串
        new PurgeFileWithHeaders
        {
            Url = "http://www.example.com/cat_picture.jpg",
            Headers = new PurgeHeaders
            {
                Origin = "cloudflare.com",
                CfIpCountry = "US",
                CfDeviceType = "desktop"
            }
        }
    }
};

// 序列化请求(以System.Text.Json为例)
var jsonPayload = JsonSerializer.Serialize(purgeRequest, new JsonSerializerOptions { WriteIndented = true });

这个方案优点是简单快捷,但缺点是Files数组是弱类型的,编译时无法校验元素类型,容易出现人为错误。

方案2:自定义JSON转换器(强类型推荐)

如果想要强类型的安全性,避免类型错误,可以创建基类+自定义JSON转换器的组合,让编译器帮我们做类型检查:

步骤1:定义基类与子类

// 抽象基类,统一两种文件类型
public abstract class PurgeFileBase { }

// 纯URL的文件类
public class PurgeFileUrl : PurgeFileBase
{
    public string Url { get; set; }

    public PurgeFileUrl(string url) => Url = url;
}

// 带Headers的文件类(和方案1一致)
public class PurgeFileWithHeaders : PurgeFileBase
{
    [JsonPropertyName("url")]
    public string Url { get; set; }

    [JsonPropertyName("headers")]
    public PurgeHeaders Headers { get; set; }
}

// Headers类(和方案1一致)
public class PurgeHeaders
{
    [JsonPropertyName("Origin")]
    public string Origin { get; set; }

    [JsonPropertyName("CF-IPCountry")]
    public string CfIpCountry { get; set; }

    [JsonPropertyName("CF-Device-Type")]
    public string CfDeviceType { get; set; }
}

步骤2:编写自定义JSON转换器

以System.Text.Json为例,实现转换器来处理字符串和对象的双向转换:

public class PurgeFileConverter : JsonConverter<PurgeFileBase>
{
    public override PurgeFileBase Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 判断JSON token类型,决定反序列化的目标
        if (reader.TokenType == JsonTokenType.String)
        {
            return new PurgeFileUrl(reader.GetString());
        }
        else if (reader.TokenType == JsonTokenType.StartObject)
        {
            return JsonSerializer.Deserialize<PurgeFileWithHeaders>(ref reader, options);
        }

        throw new JsonException("无法解析PurgeFile类型");
    }

    public override void Write(Utf8JsonWriter writer, PurgeFileBase value, JsonSerializerOptions options)
    {
        // 根据实例类型,决定序列化的格式
        if (value is PurgeFileUrl urlFile)
        {
            writer.WriteStringValue(urlFile.Url);
        }
        else if (value is PurgeFileWithHeaders headerFile)
        {
            JsonSerializer.Serialize(writer, headerFile, options);
        }
        else
        {
            throw new JsonException("不支持的PurgeFile类型");
        }
    }
}

步骤3:更新根请求类并使用转换器

public class CachePurgeRequest
{
    [JsonPropertyName("files")]
    [JsonConverter(typeof(PurgeFileConverter))] // 指定自定义转换器
    public List<PurgeFileBase> Files { get; set; } = new List<PurgeFileBase>();
}

使用示例

var purgeRequest = new CachePurgeRequest
{
    Files = new List<PurgeFileBase>
    {
        new PurgeFileUrl("http://www.example.com/css/styles.css"),
        new PurgeFileWithHeaders
        {
            Url = "http://www.example.com/cat_picture.jpg",
            Headers = new PurgeHeaders
            {
                Origin = "cloudflare.com",
                CfIpCountry = "US",
                CfDeviceType = "desktop"
            }
        }
    }
};

// 序列化请求
var jsonPayload = JsonSerializer.Serialize(purgeRequest, new JsonSerializerOptions { WriteIndented = true });

这个方案是强类型的,编译时就能校验元素类型,更适合大型项目或者需要严格类型约束的场景。

注意事项

  • 如果你使用的是Newtonsoft.Json(Json.NET),自定义转换器的写法会略有不同,但核心思路一致:判断JSON token类型来选择反序列化的目标类型。
  • 发送请求时要确保设置正确的请求头:Content-Type: application/json,否则Cloudflare API可能无法正确解析 payload。

内容的提问来源于stack exchange,提问作者Naveed Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:58:13