我一直在尝试建立一个函数来调用带有参数的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命令时,一切正常,只是无法弄清楚如何构造WebClient
或HttpWebRequest
。
我发现许多Jira用户都遇到了这个问题,在互联网上找不到一个好的解决方案。我希望找到解决方案,并通过提出这个问题来帮助遇到相同问题的其他人。
答案 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期望的方式命名它们。