C# RestClient 在指定登录详细信息时返回"Login Required"



刚刚在一家新公司开始,我们都使用Jira,客户决心不使用它,因为他们不喜欢它可以在一个不错的简单UI中记录票证并获取更新和评论。

现在我从未在2周前进行过任何编码,因此很难让我围绕C#和休息(为基本的IT修复了脚本,但从来没有像这样复杂!(

回到点,设置并与REST客户端设置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);
        }

这是剩余客户端本身的代码:

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。我认为您将使用基本的方法更简单的方法。

我不确定为什么您有一个定义自定义RestClient的课程,因为第一个代码块使用 restsharp 从http://restsharp.org。

在这种情况下,您需要修改身份验证器:

client.Authenticator = new HttpBasicAuthenticator(userName, password);

我认为您应该删除指定token的线路。我不认为这是必需的。

最后,Restclient类似乎不使用,然后将其删除。

您还可以使用您在自定义restclient中创建的内容并手动指定基本标头:

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版本中是有效的,并且可能会根据您使用的版本而有所不同。阅读有关您正在使用的版本的正确URL的JIRA API文档。我正在使用以下内容:https://docs.atlassian.com/software/jira/docs/api/rest/7.6.1/#auth/1/session

请记住,您必须存储cookie并在随后的每个请求中使用它。查看此答案有关如何将cookie添加到您的httpclient请求中:如何在httpclient的httprequestmessage上设置cookie。

完成了cookie(登录(后,只需发送与帖子相同URL的删除HTTP请求。

参考:https://stackoverflow.com/a/49109192/7763903

相关内容

最新更新