从SOAP迁移到Jira REST API后无法获取完整Issue详情
我们近期将WinForm项目中获取Jira单个Issue详情的代码从SOAP迁移至REST API后出现异常:点击刷新按钮无法获取指定Jira ID的完整Issue信息。项目基于Visual Studio 2019,使用NuGet包Atlassian.SDK 10.6.0,且已通过Insomnia和Postman验证凭证(云地址、用户名、作为密码的API Token)有效,SOAP方式下原代码可正常运行。
异常代码(无法获取完整Issue)
public Atlassian.Jira.Issue GetJiraDetails(string drNumber) { try { // 需要用户名和密码凭证 var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password); jira.Issues.MaxIssuesPerRequest = 9000; // 使用LINQ查询Issue var query = (from i in jira.Issues.Queryable where i.Key == drNumber select i).FirstOrDefault(); return query; } catch (Exception ex) { return null; } }
更新:单个字段查询可正常工作
尝试仅获取单个字段时代码能正常返回结果:
public DateTime? GetDateCreated(string drNumber) { try { // 需要用户名和密码凭证 var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password); jira.Issues.MaxIssuesPerRequest = 9000; // 使用LINQ查询创建日期字段 var dateToSave = (from i in jira.Issues.Queryable where i.Key == drNumber select i.Created).FirstOrDefault(); if (dateToSave != null) return ((DateTime)dateToSave).AddHours(-4); } catch (Exception ex) { throw (ex); } return null; }
问题原因与解决方案
核心原因
Atlassian.SDK的REST实现中,通过Issues.Queryable查询完整Issue对象时,默认不会请求所有字段,部分字段需要显式加载;而查询单个字段时,SDK会自动仅请求该字段的数据,避免了字段缺失的问题。另外,原代码直接返回null的异常处理会掩盖具体错误信息,无法定位问题根源。
解决方案
直接通过Issue Key获取完整对象
替换LINQ查询逻辑,使用SDK提供的GetIssueAsync方法直接获取完整Issue,该方法默认会加载所有必要字段:public Atlassian.Jira.Issue GetJiraDetails(string drNumber) { try { var jira = Jira.CreateRestClient(CloudJiraAddress, userName, password); return jira.Issues.GetIssueAsync(drNumber).Result; } catch (Exception ex) { // 记录异常日志或抛出具体信息,便于排查 Console.WriteLine($"获取Jira详情失败: {ex.Message}"); throw; } }LINQ查询时显式扩展字段
如果坚持使用LINQ查询,可通过Expand方法指定需要加载的字段,使用*表示加载所有字段,也可指定具体字段减少请求数据量:var query = (from i in jira.Issues.Queryable.Expand("*") where i.Key == drNumber select i).FirstOrDefault();修复异常处理逻辑
原代码捕获异常后直接返回null,无法得知具体错误(如权限不足、字段不存在、网络异常等)。建议改为记录异常日志并重新抛出,或返回包含错误信息的结果,方便问题排查。检查API权限
确认API Token对应的用户账号拥有查看该Issue所有字段的权限,部分敏感字段可能需要特定权限才能访问,导致完整Issue加载失败,但单个公开字段可正常返回。
内容的提问来源于stack exchange,提问作者Robert

