如何使用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
相关产品推荐
相关产品推荐

