刚开始在一家新公司开始我们都使用Jira,客户决心不使用它,因为他们不喜欢它所以我决定构建一个简单的Windows窗体,当他们既可以记录门票又可以获得更新和评论。很简单的UI。
现在我在2周之前从未做过任何编码,因此我很难理解C#和Rest(已经制作了基本IT修复的脚本,但从来没有像这样复杂!)
回到点,设置并使用Rest Client设置Rest API,但每次我尝试从Jira上的票据中提取数据时,我都会收到错误:
{“errorMessages”:[“您无权查看指定的问题。”,“需要登录”],“错误”:{}}
以下是表单中的代码:
private void button3_Click_1(object sender, EventArgs e)
{
var client = new RestClient("https://jira.eandl.co.uk/rest/api/2/issue/ITREQ-" + textBox1.Text
);
client.Authenticator = new SimpleAuthenticator("username", "abc", "password", "123");
var request = new RestRequest(Method.GET);
request.AddParameter("token", "saga001", ParameterType.UrlSegment);
// request.AddUrlSegment("token", "saga001");
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
var queryResult = client.Execute(request);
Console.WriteLine(queryResult.Content);
}
这是来自Rest Client本身的代码:
public Restclient()
{
endPoint = string.Empty;
httpMethod = httpVerb.GET;
}
private string logonAttempt;
public string makeRequest()
{
string strResponseValue = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);
request.Method = httpMethod.ToString();
String authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(userName + ":" + userPassword));
request.Headers.Add("Authorization", authType.ToString() + " " + authHeader);
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
//Process the Response Stream... (Could be JSON, XML ot HTML etc...)
using (Stream responseStream = response.GetResponseStream())
{
if (responseStream != null)
{
using (StreamReader reader = new StreamReader(responseStream))
{
strResponseValue = reader.ReadToEnd();
}//End of Stream Reader
}
}//end of Response Stream
}
catch (Exception ex)
{
strResponseValue = "(\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
}
finally
{
if(response != null)
{
((IDisposable)response).Dispose();
}
}
return strResponseValue;
}
}
}
现在显然我期待我错过了一些像我说的那样绝对比较大的东西,我以前从未接受过这样的项目并且有过0次经验。
只是找人直截了当地告诉我我做错了什么
根据答案改为:
private void button3_Click_1(object sender, EventArgs e)
{
var client = new
RestClient("https://jira.eandl.co.uk/rest/api/2/issue/ITREQ-" + textBox1.Text
);
client.Authenticator = new HttpBasicAuthenticator("username", "password");
var request = new RestRequest(Method.GET);
string authHeader = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("cdale!" + ":" + "Chantelle95!"));
request.AddHeader("Authorization", "Basic " + authHeader);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
var queryResult = client.Execute(request);
Console.WriteLine(queryResult.Content);
}
默认情况下,使用Jira REST API,您可以使用基本身份验证或OAuth2。我认为更简单的方法是使用Basic。
我不确定为什么你有一个定义自定义RestClient
的类,因为第一个代码块使用了http://restsharp.org中的RestSharp。
在这种情况下,您需要修改验证器:
client.Authenticator = new HttpBasicAuthenticator(userName, password);
而且我认为您应该删除指定token
的行。我不认为这是必需的。
最后,似乎没有使用类Restclient
,然后删除它。
您还可以使用在自定义RestClient中创建的内容并手动指定Basic标头:
string authHeader = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(userName + ":" + userPassword));
request.AddHeader("Authorization", "Basic " + authHeader);
然而,它本质上是HttpBasicAuthenticator
类的行为。
如果您不想在每个请求中对您的凭据进行编码,那么如何使用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; }
}
当我使用url:http://[baseJiraUrl]/rest/auth/1/session调用它时,它返回以下JSON响应:
{
"session" : -{
"name" : JSESSIONID,
"value" : cookieValue
}
请记住,上面的URL在我正在使用的JIRA版本中有效,可能会根据您使用的版本而有所不同。阅读JIRA API文档,了解您使用的版本的正确URL。我正在使用以下内容:https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#auth/1/session
请记住,您必须存储您的cookie并在每个后续请求中使用它。查看有关如何在您的HttpClient请求中添加cookie的答案:How do I set a cookie on HttpClient's HttpRequestMessage。
一旦你完成了cookie(注销),只需发送一个删除http请求,其URL与帖子相同。