JIRA REST API登录使用C#

问题描述:

我已经写了下面的C#代码登录到JIRA的REST API:JIRA REST API登录使用C#

var url = new Uri("http://localhost:8090/rest/auth/latest/session?os_username=tempusername&os_password=temppwd"); 
var request = WebRequest.Create(url) as HttpWebRequest; 
if (null == request) 
{ 
return ""; 
} 
request.Method = "POST"; 
request.ContentType = "application/json"; 
request.ContentLength = 200; 
request.KeepAlive = false; 
using (var response = request.GetResponse() as HttpWebResponse) 
{ 
} 

当我执行此,应用程序只是那张不返回任何响应运行。请建议如果这是使用REST API调用JIRA登录的正确方式

+0

为什么你指定了ContentType和ContentLength?我没有看到代码中包含任何实际的内容/正文。 – Pete 2012-08-08 17:19:07

+0

你说没有任何回应返回,请request.GetResponse()抛出异常?网络服务器至少应该有某种回应。 – Joppe 2012-08-25 11:51:05

对于基本身份验证,您需要以base64编码发送用户名和密码。指南可以在atlassians开发者页面的API的例子可以发现: https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Basic+Authentication ,如果你在C#中做它您需要发送的编码数据的报头格式如下:

“授权:基本[ENCODED CREDENTIALS]”

下面是一个简单的例子:

public enum JiraResource 
{ 
    project 
} 

protected string RunQuery(
    JiraResource resource, 
    string argument = null, 
    string data = null, 
    string method = "GET") 
{ 
    string url = string.Format("{0}{1}/", m_BaseUrl, resource.ToString()); 

    if (argument != null) 
    { 
     url = string.Format("{0}{1}/", url, argument); 
    } 

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
    request.ContentType = "application/json"; 
    request.Method = method; 

    if (data != null) 
    { 
     using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write(data); 
     } 
    } 

    string base64Credentials = GetEncodedCredentials(); 
    request.Headers.Add("Authorization", "Basic " + base64Credentials); 

    HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

    string result = string.Empty; 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     result = reader.ReadToEnd(); 
    } 

    return result; 
} 

private string GetEncodedCredentials() 
{ 
    string mergedCredentials = string.Format("{0}:{1}", m_Username, m_Password); 
    byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials); 
    return Convert.ToBase64String(byteCredentials); 
} 

(JiraResource只是一个枚举我使用来决定使用该API的一部分)

我希望这会有所帮助!

+2

这应该被接受为答案。我测试过它,它工作。 – EvAlex 2014-09-04 20:35:47

+0

非常感谢很多人,这帮了我很大的时间! – jfplataroti 2015-04-01 15:31:17

+0

如果您尝试使用WCF服务进行连接,则此解决方案将不起作用。 – AskMe 2015-08-07 07:46:26

这里有一个简单的解决方案,它的工作原理是必需的:

var mergedCredentials = string.Format("{0}:{1}", username, password); 
var byteCredentials = Encoding.UTF8.GetBytes(mergedCredentials); 
var encodedCredentials = Convert.ToBase64String(byteCredentials); 

using (WebClient webClient = new WebClient()) 
{ 
    webClient.Headers.Set("Authorization", "Basic " + encodedCredentials); 

    return webClient.DownloadString(url); 
} 

如果你不想在编码每个请求您的凭据这里是如何使用Cookie来做到这一点。

请求cookie时,您不需要在标头上添加任何授权。此方法将接受带有用户名和密码以及URL的JSON字符串。它会返回cookie值。

public async Task<JiraCookie> GetCookieAsync(string myJsonUserNamePassword, string JiraCookieEndpointUrl) 
{ 
    using (var client = new HttpClient()) 
     { 
      var response = await client.PostAsync(
       JiraCookieEndpointUrl, 
       new StringContent(myJsonUserNamePassword, Encoding.UTF8, "application/json")); 
      var json = response.Content.ReadAsStringAsync().Result; 
       var jiraCookie= JsonConvert.DeserializeObject<JiraCookie>(json); 
       return jArr; 
     } 
} 

public class JiraCookie 
{ 
    public Session session { get; set; } 
} 

public class Session 
{ 
    public string name { get; set; } 
    public string value { get; set; } 
} 

当我把它用网址:http://[baseJiraUrl]/rest/auth/1/session它返回以下JSON响应:

{ 
"session" : -{ 
"name" : JSESSIONID, 
"value" : cookieValue 
} 

记住上面的网址是JIRA的版本,我使用的是有效的,并可以根据变化您正在使用哪个版本。阅读JIRA API文档以获取正在使用的版本的正确URL。我使用以下内容: https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#auth/1/session

请记住,您必须存储您的Cookie并将其用于每个后续请求。 看看这个答案如何添加cookie到你的HttpClient请求:How do I set a cookie on HttpClient's HttpRequestMessage

一旦你完成了cookie(注销),只需发送一个删除http请求,其URL与帖子相同。