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

如何使用C#与Directus API结合JWT令牌增改CMS后台数据库记录

C# 调用 Directus API 实现记录插入与更新(带 JWT 认证)

前置依赖

  • 引用 System.Net.Http 和 System.Text.Json 命名空间(.NET Core/.NET 5+ 自带,无需额外安装)
  • 确保拥有 Directus 实例访问地址、有效用户名/密码,以及目标集合(Collection)的操作权限

第一步:获取 JWT 令牌

Directus 所有数据操作接口都需要 JWT 令牌认证,先实现令牌获取逻辑:

using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

public class DirectusService
{
    private readonly HttpClient _httpClient;
    private string _accessToken;

    public DirectusService(string directusBaseUrl)
    {
        _httpClient = new HttpClient { BaseAddress = new Uri(directusBaseUrl) };
    }

    // 登录获取 JWT 令牌
    public async Task<bool> LoginAsync(string username, string password)
    {
        var loginPayload = new
        {
            email = username, // 若用户用用户名登录则替换为 username 字段
            password = password
        };

        var jsonContent = new StringContent(
            JsonSerializer.Serialize(loginPayload),
            Encoding.UTF8,
            "application/json");

        var response = await _httpClient.PostAsync("/auth/login", jsonContent);
        if (!response.IsSuccessStatusCode) return false;

        var responseBody = await response.Content.ReadAsStringAsync();
        var loginResult = JsonSerializer.Deserialize<JsonElement>(responseBody);
        _accessToken = loginResult.GetProperty("data").GetProperty("access_token").GetString();
        
        // 设置全局请求头,后续接口自动携带令牌
        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);
        return true;
    }
}

第二步:插入记录(POST 请求)

以插入 articles 集合为例,假设集合包含 title、content、publish_date 字段:

// 定义与 Directus 集合字段匹配的模型类
public class Article
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishDate { get; set; }
}

// 在 DirectusService 中添加插入方法
public async Task<JsonElement> InsertArticleAsync(Article article)
{
    var insertPayload = new
    {
        title = article.Title,
        content = article.Content,
        publish_date = article.PublishDate.ToString("yyyy-MM-ddTHH:mm:ssZ") // 需符合 ISO 8601 UTC 格式
    };

    var jsonContent = new StringContent(
        JsonSerializer.Serialize(insertPayload),
        Encoding.UTF8,
        "application/json");

    var response = await _httpClient.PostAsync("/items/articles", jsonContent);
    response.EnsureSuccessStatusCode(); // 请求失败时抛出异常,可按需调整错误处理逻辑

    var responseBody = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<JsonElement>(responseBody);
}

第三步:更新记录(PATCH 请求)

更新指定 ID 的文章,只需传入需要修改的字段即可:

// 在 DirectusService 中添加更新方法
public async Task<JsonElement> UpdateArticleAsync(string articleId, Dictionary<string, object> updateFields)
{
    var jsonContent = new StringContent(
        JsonSerializer.Serialize(updateFields),
        Encoding.UTF8,
        "application/json");

    var response = await _httpClient.PatchAsync($"/items/articles/{articleId}", jsonContent);
    response.EnsureSuccessStatusCode();

    var responseBody = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<JsonElement>(responseBody);
}

完整使用示例

public async Task RunDirectusOperations()
{
    var directusService = new DirectusService("https://your-directus-instance.com");
    
    // 1. 登录获取令牌
    var loginSuccess = await directusService.LoginAsync("your-username", "your-password");
    if (!loginSuccess)
    {
        Console.WriteLine("登录失败,请检查账号密码");
        return;
    }

    // 2. 插入新文章
    var newArticle = new Article
    {
        Title = "C# 操作 Directus 示例",
        Content = "这是一篇测试文章内容",
        PublishDate = DateTime.UtcNow
    };
    var insertResult = await directusService.InsertArticleAsync(newArticle);
    var insertedId = insertResult.GetProperty("data").GetProperty("id").GetString();
    Console.WriteLine($"文章插入成功,ID:{insertedId}");

    // 3. 更新文章标题
    var updateFields = new Dictionary<string, object>
    {
        { "title", "更新后的文章标题" }
    };
    await directusService.UpdateArticleAsync(insertedId, updateFields);
    Console.WriteLine("文章标题更新成功");
}

关键注意事项

  • 集合与字段名:必须与 Directus 后台配置的名称完全一致(区分大小写)
  • 日期格式:Directus 要求日期时间字段使用 ISO 8601 UTC 格式,避免时区解析错误
  • 令牌过期:JWT 令牌存在有效期,可通过 /auth/refresh 接口刷新,建议在请求前检查令牌状态
  • 错误处理:示例中使用 EnsureSuccessStatusCode() 抛出异常,实际项目可根据状态码(如 401 令牌过期、403 无权限)做针对性处理
  • HttpClient 复用:避免频繁创建 HttpClient 实例,示例中在类构造函数初始化符合最佳实践

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39