Задача HttpClient возвращает System.Threading.Tasks.Task`1 [System.String], а не JSON, как ожидалось - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь получить доступ к ответу JSON, который должен сгенерировать следующий код:

public static async Task<string> GetResponseString(string refreshToken)
    {
        var client = new HttpClient();
        client.BaseAddress = new Uri("https://www.strava.com");
        var request = new HttpRequestMessage(HttpMethod.Post, "/oauth/token");

        var keyValues = new List<KeyValuePair<string, string>>();
        keyValues.Add(new KeyValuePair<string, string>("client_id", "some_id"));
        keyValues.Add(new KeyValuePair<string, string>("client_secret", "some_secret"));
        keyValues.Add(new KeyValuePair<string, string>("refresh_token", refreshToken));
        keyValues.Add(new KeyValuePair<string, string>("grant_type", "refresh_token"));

        request.Content = new FormUrlEncodedContent(keyValues);
        var response = await client.SendAsync(request);
        var result = await response.Content.ReadAsStringAsync();

        return result;
    }

Ожидаемый результат выглядит следующим образом.

    {
  "token_type": "Bearer",
  "access_token": "a9b723...",
  "expires_at":1568775134,
  "expires_in":20566,
  "refresh_token":"b5c569..."
}

При выполнении этого в Postman или Javscript результат верен, поэтому я предполагаю, что я не могу получить доступ к строке задачи правильным образом: -)

Любая помощь, указывающая мне в правильном направлении, будет очень принята.

Thnx

1 Ответ

1 голос
/ 12 июля 2020

Ваш код содержит более одной ошибки.

Вы видели HttpClient документацию? Знаете ли вы о IDisposable? Знаете ли вы, что набор KeyValuePair равен Dictionary?

Не используйте ключевое слово var, если вы не совсем уверены, что делаете. var может скрыть от вас исходную проблему, и ваш вопрос - это пример того, как var убивает ваше время. Я рекомендую использовать явные типы, где это возможно.

И да, как указано выше в комментариях, вы должны развернуть string результат из awaitable Task с await.

private static readonly HttpClient client = new HttpClient();

private static async Task<string> GetResponseStringAsync(string url, Dictionary<string, string> formData)
{
    using (HttpContent content = new FormUrlEncodedContent(formData))
    using (HttpResponseMessage response = await client.PostAsync(url, content))
    {
         response.EnsureSuccessStatusCode();
         return await response.Content.ReadAsStringAsync();
    }
}

Использование

Dictionary<string, string> postData = new Dictionary<string, string>();
postData.Add("client_id", "some_id");
postData.Add("client_secret", "some_secret");
postData.Add("refresh_token", refreshToken);
postData.Add("grant_type", "refresh_token");

try
{
    string result = await GetResponseStringAsync("https://www.strava.com/oauth/token", postData);
    // success here
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
    // request failed
}

И наконец, время сказать привет Асинхронному программированию . :)

...