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

调用JIRA REST API创建工单返回HTTP 200但工单未生成

问题排查与解决方案

我帮你梳理下为什么返回200 Found但工单没创建成功的核心原因,以及对应的修复方案:

1. 最关键的问题:请求地址重复导致无效调用

你把完整的API路径 https://proactioneu.ent.cgi.com/rest/api/latest/issue 设置成了HttpClient的BaseAddress,然后又在PostAsync里传入了"issue"参数,这会让实际请求的URL变成:
https://proactioneu.ent.cgi.com/rest/api/latest/issue/issue
这个地址根本不存在,JIRA返回的200 Found其实是错误页面的状态码,而非创建成功的响应。

2. 其他需要优化的点

  • 手动拼接JSON容易出错:直接写字符串JSON很容易出现拼写错误、格式问题,建议用强类型对象序列化的方式,既直观又不容易出错。
  • 同步调用Result可能有隐患:虽然控制台程序里暂时不会有死锁问题,但异步/await模式是HttpClient的最佳实践。
  • 未读取响应内容:你只打印了响应对象,没有读取具体的响应文本,无法看到JIRA返回的错误详情,这会阻碍问题排查。

修正后的完整代码

下面是调整后的代码,解决了地址问题,同时优化了请求方式:

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

class Program
{
    static async Task Main(string[] args)
    {
        // JIRA根地址,不要包含具体的API路径
        string jiraRootUrl = "https://proactioneu.ent.cgi.com";
        // 具体的创建工单API路径
        string createIssueApi = "/rest/api/latest/issue";

        // 用强类型对象构造工单数据,避免手动拼JSON的错误
        var issuePayload = new
        {
            fields = new
            {
                project = new { key = "TOTEM" },
                summary = "just a test",
                description = "Creating of an issue using project keys and issue type names using the REST API",
                issuetype = new { name = "Task" },
                assignee = new { name = "imane.elbarchi" }
            }
        };

        // 序列化对象为JSON字符串
        string jsonPayload = JsonSerializer.Serialize(issuePayload);

        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(jiraRootUrl);
            
            // 设置Basic认证
            string credentials = "username:password";
            byte[] credBytes = UTF8Encoding.UTF8.GetBytes(credentials);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credBytes));
            
            // 指定接收JSON格式的响应
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // 创建请求内容
            var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");

            // 异步发送POST请求(最佳实践)
            HttpResponseMessage response = await client.PostAsync(createIssueApi, content);

            // 读取响应内容,方便排查问题
            string responseContent = await response.Content.ReadAsStringAsync();
            Console.WriteLine($"响应状态码: {response.StatusCode}");
            Console.WriteLine($"响应详情: {responseContent}");

            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("工单创建成功!");
                // 解析响应获取工单Key
                var createdIssue = JsonSerializer.Deserialize<dynamic>(responseContent);
                Console.WriteLine($"生成的工单Key: {createdIssue.key}");
            }
            else
            {
                Console.WriteLine("工单创建失败,错误信息已打印在上方");
            }

            Console.ReadKey();
        }
    }
}

额外排查要点

如果修正地址后还是失败,可以检查这些点:

  • 认证信息是否正确:如果你的JIRA开启了双因素认证,必须使用API Token代替密码,而不是登录密码。
  • 权限与项目信息:确认你有在"TOTEM"项目创建工单的权限,项目Key拼写正确;经办人"imane.elbarchi"的用户名在JIRA中存在且属于该项目。
  • API版本兼容性:如果你的JIRA是新版本,可以尝试把API路径换成/rest/api/3/issue,v3是JIRA最新的REST API版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:00:28