如何正确调用Jira Rest API

时间:2019-02-04 09:06:30

标签: c# asp.net rest jira-rest-api

我一直在尝试建立一个函数来调用带有参数的Jira Rest API,以便能够在Jira中创建问题。要调用Rest API,Jira提供了一个文档,该文档描述了如何调用Rest API here。在网站上,给出了CURL和JSON。这是我尝试在C#中设置的REST API请求:

curl -D- -u peno.ch:yourpassword -H "Content-Type: application/json" --data @foo.json https://jira-test.ch.*******.net/rest/api/latest/issue/

这是foo.json负载:

{
    "fields": {
   "project":
   {
      "key": "FOO"
   },
   "summary": "Test the REST API",
   "issuetype": {
      "name": "Task"
   }
  }
 }

我尝试实现HttpWebRequest来调用Rest API,并且尝试使用WebClient。他们都没有工作。我对API有所了解,但我认为参数不正确,我在那儿做错了。同样在Google上,我没有找到任何解决方案。

执行以下功能时,我从Jira收到内部错误。 (没有有关该错误的具体信息)

public static void CreateJiraRequest(JiraApiObject jiraApiObject)
{
    string url = "https://jira-test.ch.*******.net/rest/api/latest/issue/";
    string user = "peno.ch";
    string password = "****";

    var client = new WebClient();        
    string data = JsonConvert.SerializeObject(jiraApiObject);
    client.Credentials = new System.Net.NetworkCredential(user, password);
    client.UploadStringTaskAsync(url, data);
}

这是我的JiraApiObject,它完全转换为上面显示的Json有效负载。

public class JiraApiObject
{
    public class Project
    {
        public string key { get; set; }
    }

    public class Issuetype
    {
        public string name { get; set; }
    }

    public class Fields
    {
        public Project project { get; set; }
        public Issuetype issuetype { get; set; }
        public string summary { get; set; }
    }

    public class RootObject
    {
        public Fields fields { get; set; }
    }
}

当我在控制台上执行CURL命令时,一切正常,只是无法弄清楚如何构造WebClientHttpWebRequest

我发现许多Jira用户都遇到了这个问题,在互联网上找不到一个好的解决方案。我希望找到解决方案,并通过提出这个问题来帮助遇到相同问题的其他人。

1 个答案:

答案 0 :(得分:1)

通常,最佳做法是(最好多次)在每次进行REST API调用时都明确指定内容类型,HTTP方法等。另外,我更喜欢使用 HttpWebRequest 对象进行REST API调用。这是重构后的代码:

public static void CreateJiraRequest(Chat jiraApiObject)
{
    string url = "https://jira-test.ch.*******.net/rest/api/latest/issue/";
    string user = "peno.ch";
    string password = "****";

    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.Credentials = new System.Net.NetworkCredential(user, password);

    string data = JsonConvert.SerializeObject(jiraApiObject);

    using (var webStream = request.GetRequestStream())
    using (var requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
    {
        requestWriter.Write(data);
    }

    try
    {
        var webResponse = request.GetResponse();
        using (var responseReader = new StreamReader(webResponse.GetResponseStream()))
        {
            string response = responseReader.ReadToEnd();
            // Do what you need to do with the response here.
        }
    }
    catch (Exception ex)
    {
        // Handle your exception here
        throw ex;
    }
}

此外,请确保序列化 JiraApiObject 后的JSON结构与所需的API JSON结构相匹配。为了方便起见,您可能需要考虑在类和属性上使用 JsonObject JsonProperty 属性,以便按API期望的方式命名它们。