【问题标题】:Using HttpClient to GET使用 HttpClient 获取
【发布时间】:2016-11-24 22:57:46
【问题描述】:

所以,因为HttpClient“更好”,我需要将WebClient 转换为HttpClient,但它无法按预期工作。以下函数使用WebClient 并且像一个魅力一样工作。

private static void Authenticate()
{
    Console.WriteLine("Authenticating . . .");
    var clientId = ConfigurationManager.AppSettings["AuthNClientId"];
    var uri = ConfigurationManager.AppSettings["AuthNUri"];
    var userName = ConfigurationManager.AppSettings["AuthNUserName"];
    var password = ConfigurationManager.AppSettings["AuthNPassword"];

    var client = new WebClient();
    string formData = $"client_id={clientId}&grant_type=password&username={userName}&password={password}";
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    var response = client.UploadString($"{uri}", formData);
    dynamic authResult = JsonConvert.DeserializeObject(response);
    _accessToken = authResult.access_token;
    if (_accessToken == null)
    {
        throw new ApplicationException("Unable to authenticate. Check your configuration file <appSettings>.");
    }
    Console.WriteLine("Authenticated.");
}

另一方面,此代码返回 BadRequest 响应代码。

static async Task<string> GetAuthenticationToken()
{
    string token = string.Empty;

    var clientId = ConfigurationManager.AppSettings["AuthNClientId"];
    var uri = ConfigurationManager.AppSettings["AuthNUri"];
    var userName = ConfigurationManager.AppSettings["AuthNUserName"];
    var password = ConfigurationManager.AppSettings["AuthNPassword"];

    client.BaseAddress = new Uri("https://myurl.com/oauth2/token");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Add("ContentType", "application/x-www-form-urlencoded");

    var path = $"client_id={clientId}&grant_type=password&username={userName}&password={password}";
    HttpResponseMessage response = await client.GetAsync($"https://myurl.com/oauth2/token?{path}");
    if (response.IsSuccessStatusCode)
    {
        Console.WriteLine("success");
        token = await response.Content.ReadAsStringAsync();
    }
    else { Console.WriteLine($"failure: {response.StatusCode}"); }
    return token;
}

您可以看到我已经尝试了几种方法,包括设置客户端 BaseAddress 以及尝试将 url 传递给 GetAsync 方法。

有人看到我在这里做错了吗?

【问题讨论】:

  • HttpClient 代码中,您没有显示client 正在初始化。

标签: c# httpclient webclient


【解决方案1】:

UploadString 是第一个示例中的 POST 方法。在第二个示例中,正在执行 GET 方法。

static async Task<string> GetAuthenticationTokenAsync() {
    string token = string.Empty;

    var clientId = ConfigurationManager.AppSettings["AuthNClientId"];
    var uri = ConfigurationManager.AppSettings["AuthNUri"];
    var userName = ConfigurationManager.AppSettings["AuthNUserName"];
    var password = ConfigurationManager.AppSettings["AuthNPassword"];

    var client = new HttpClient();
    client.BaseAddress = new Uri(uri);
    client.DefaultRequestHeaders.Accept.Clear();

    var nameValueCollection = new Distionary<string, string>() {
        { "client_id", clientId },
        { "grant_type", "password" },
        { "username", userName },
        { "password", password },
    };
    var content = new FormUrlEncodedContent(nameValueCollection);
    var response = await client.PostAsync("", content);
    if (response.IsSuccessStatusCode) {
        Console.WriteLine("success");
        var json = await response.Content.ReadAsStringAsync();
        dynamic authResult = JsonConvert.DeserializeObject(json);
        token = authResult.access_token;
    }
    else { Console.WriteLine($"failure: {response.StatusCode}"); }
    return token;
}

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多