Подтвердить что ты не робот

Получение данных JSON обратно из HTTP-запроса

У меня есть веб-запрос, который работает правильно, но он просто возвращает статус в порядке, но мне нужен объект, который я запрашиваю, чтобы он вернулся. Я не уверен, как получить значение JSON, которое я запрашиваю. Я новичок в использовании объекта HttpClient, есть ли свойство, которое я пропускаю? Мне действительно нужен возвращаемый объект. Спасибо за любую помощь

Посылка вызова - работает нормально, возвращает статус ОК.

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;

Метод получения API

//Cut out alot of code but you get the idea
public string Get()
{
    return JsonConvert.SerializeObject(returnedPhoto);
}
4b9b3361

Ответ 1

Если вы ссылаетесь на System.Net.HttpClient в .NET 4.5, вы можете получить содержимое, возвращенное GetAsync, используя свойство HttpResponseMessage.Content как HttpContent - пронумерованный объект. Затем вы можете прочитать содержимое в строке, используя метод HttpContent.ReadAsStringAsync или как поток, используя ReadAsStreamAsync.

Документация класса HttpClient включает в себя этот пример:

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();

Ответ 2

Основываясь на ответе @Panagiotis Kanavos, приведем рабочий метод в качестве примера, который также будет возвращать ответ в виде объекта вместо строки:

public static async Task<object> PostCallAPI(string url, object jsonObject)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            if (response != null)
            {
                var jsonString = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<object>(jsonString);
            }
        }
    }
    catch (Exception ex)
    {
        myCustomLogger.LogException(ex);
    }
    return null;
}

Имейте в виду, что это только пример, и вы, вероятно, хотели бы использовать HttpClient в качестве общего экземпляра вместо использования его в предложении использования.

Ответ 3

Что я обычно делаю, похоже на один ответ:

var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object

if (response.IsSuccessStatusCode == true)
    {
        string res = await response.Content.ReadAsStringAsync();
        var content = Json.Deserialize<Model>(res);

// do whatever you need with the JSON which is in 'content'
// ex: int id = content.Id;

        Navigate();
        return true;
    }
    else
    {
        await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect.");
        return false;
    }

Где "модель" - это ваш класс модели С#.

Ответ 4

Я думаю, что самый короткий путь:

var client = new HttpClient();
string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}";
var prodResp = await client.GetAsync(reqUrl);
if (!prodResp.IsSuccessStatusCode){
    FailRequirement();
}
var prods = await prodResp.Content.ReadAsAsync<Products>();