尝试访问 REST 时出现 401(未授权)API
401 (Unauthorized) when trying to access REST API
基本上,我正在尝试在线连接到 REST API。够简单了吧?
但是,每当我尝试连接时,都会收到 401(未经授权)错误。我正在使用 C# 控制台应用程序对此进行测试,我还尝试使用 PUTMAN(Google Chrome 应用程序来查看 HTTP 请求)。
这是我正在使用的 link 到 API:https://community.dynatrace.com/community/display/APMSAASDOC/Login+-+REST+API
我遵循列出的所有步骤。我知道我的用户名和密码是正确的(已登录到 Dynatrace 门户)。有谁知道可能出什么问题了吗?下面是我的代码(出于显而易见的原因,我删除了实际的用户名和密码):
static async Task RunAsync()
{
string _user;
string _password;
string _authorizationType;
string _contentType;
string _CredentialsToBase64;
string _url = "https://datafeed-api.dynatrace.com";
_user = "MYUSERNAME";
_password = "MYPASSWORD";
_authorizationType = "basic";
_contentType = "application/json";
_CredentialsToBase64 = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(_user + ":" + _password));
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_contentType));
client.DefaultRequestHeaders.Add("Authorization", _authorizationType + " " + _CredentialsToBase64);
using (HttpResponseMessage httpResponse = await client.GetAsync("publicapi/rest/v1.0/login?user=MYUSERNAME&password=MYPASSWORD HTTP/1.1"))
{
if (httpResponse.IsSuccessStatusCode)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine(string.Format("Service request failed ({0})", httpResponse.StatusCode));
}
}
}
client.GetAsync
方法调用末尾的 HTTP/1.1
字符串可能被翻译成 password=MYPASSWORD%20HTTP/1.1
(或类似字符串),这会导致错误。尝试删除它,看看它是否有效。
注: %20
是urlencoded space
另一个选项 this post 的答案可能相关。总而言之,格式化请求似乎需要 BaseAddress 有一个尾部斜杠并且 GetAsync
字符串不以斜杠开头。
从 GET url 的末尾删除“HTTP/1.1”,它被添加到密码的末尾,因此 401
抱歉让大家头疼。问题是公司本身的帐户问题。我联系了他们,他们注意到问题出在帐户从旧门户迁移到新门户时。所以我们的结局没有错。感谢大家的帮助!
基本上,我正在尝试在线连接到 REST API。够简单了吧?
但是,每当我尝试连接时,都会收到 401(未经授权)错误。我正在使用 C# 控制台应用程序对此进行测试,我还尝试使用 PUTMAN(Google Chrome 应用程序来查看 HTTP 请求)。
这是我正在使用的 link 到 API:https://community.dynatrace.com/community/display/APMSAASDOC/Login+-+REST+API
我遵循列出的所有步骤。我知道我的用户名和密码是正确的(已登录到 Dynatrace 门户)。有谁知道可能出什么问题了吗?下面是我的代码(出于显而易见的原因,我删除了实际的用户名和密码):
static async Task RunAsync()
{
string _user;
string _password;
string _authorizationType;
string _contentType;
string _CredentialsToBase64;
string _url = "https://datafeed-api.dynatrace.com";
_user = "MYUSERNAME";
_password = "MYPASSWORD";
_authorizationType = "basic";
_contentType = "application/json";
_CredentialsToBase64 = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(_user + ":" + _password));
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_contentType));
client.DefaultRequestHeaders.Add("Authorization", _authorizationType + " " + _CredentialsToBase64);
using (HttpResponseMessage httpResponse = await client.GetAsync("publicapi/rest/v1.0/login?user=MYUSERNAME&password=MYPASSWORD HTTP/1.1"))
{
if (httpResponse.IsSuccessStatusCode)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine(string.Format("Service request failed ({0})", httpResponse.StatusCode));
}
}
}
client.GetAsync
方法调用末尾的 HTTP/1.1
字符串可能被翻译成 password=MYPASSWORD%20HTTP/1.1
(或类似字符串),这会导致错误。尝试删除它,看看它是否有效。
注: %20
是urlencoded space
另一个选项 this post 的答案可能相关。总而言之,格式化请求似乎需要 BaseAddress 有一个尾部斜杠并且 GetAsync
字符串不以斜杠开头。
从 GET url 的末尾删除“HTTP/1.1”,它被添加到密码的末尾,因此 401
抱歉让大家头疼。问题是公司本身的帐户问题。我联系了他们,他们注意到问题出在帐户从旧门户迁移到新门户时。所以我们的结局没有错。感谢大家的帮助!