2

我尝试在下面使用此 C# 代码,但得到状态代码 401(原因:未授权):

var baseUri = "https://ansibletower1.test1.com";

var data = @"{'username':'test123', 'password':'a1b2c3Z0!-99', 'description':'Ansible Api token', 'scope':'write'}";

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri(baseUri);
    var content = new StringContent(data, Encoding.UTF8, "application/json");

    var response = httpClient.PostAsync("api/v2/tokens", content).Result;

    if (response.StatusCode == HttpStatusCode.OK)
    {
        var result = response.Content.ReadAsStringAsync().Result;                   
        if (result != null)
        {
            return result;
        }
    }
}

Try-2:使用基本授权标头.. 得到相同的错误(401-未经授权)。我从 python 脚本中尝试过,它可以工作。在其中使用了基本授权标头。

var baseUri = "https://ansibletower1.test1.com";
var jsonObject = new {description = "Tower API token", scope = "write" };
var username="test123";
var password="a1b2c3Z0!-99";

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri(baseUri);
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                "Basic", Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes($"{username}:{password}")));

    var content = new StringContent(JsonConvert.SerializeObject(jsonObject), Encoding.UTF8, "application/json");
    var response = httpClient.PostAsync("api/v2/tokens", content).Result;

    if (response.StatusCode == HttpStatusCode.OK)
    {
        var result = response.Content.ReadAsStringAsync().Result;                   
        if (result != null)
        {
            return result;
        }
    }
}
4

1 回答 1

1

我想通了。url "api/v2/tokens" 最后缺少 "/"。

它应该是: var response = httpClient.PostAsync("api/v2/tokens/", content).Result;

于 2021-10-25T21:39:30.497 回答