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登录的正确方式
对于基本身份验证,您需要以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的一部分)
我希望这会有所帮助!
这应该被接受为答案。我测试过它,它工作。 – EvAlex 2014-09-04 20:35:47
非常感谢很多人,这帮了我很大的时间! – jfplataroti 2015-04-01 15:31:17
如果您尝试使用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与帖子相同。
为什么你指定了ContentType和ContentLength?我没有看到代码中包含任何实际的内容/正文。 – Pete 2012-08-08 17:19:07
你说没有任何回应返回,请request.GetResponse()抛出异常?网络服务器至少应该有某种回应。 – Joppe 2012-08-25 11:51:05