如何在C#中检索和使用通过Http GET请求获取的数据

时间:2020-07-31 13:48:38

标签: c# http

因此,我尝试将GET请求与c#一起使用,但实际上没有任何效果。 我想使用站点https://covid19.mathdro.id/api作为测试,以查看是否可以从那里获取信息并在Windows窗体中使用它。但是我似乎不知道如何。我发现的唯一指南并不是真的那么有用,只是让我更加困惑。有人可以帮我吗?

我尝试将HttpClient与JSON.net结合使用,但感到困惑。 自从我从未使用c#处理Python之外的c#中的HTTP GET请求以来,已经尝试了两个小时。

2 个答案:

答案 0 :(得分:1)

安装“ Newtonsoft.Json” nuget软件包。

async Task<JToken> GetREST(string uri)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(uri);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // HTTP GET
        HttpResponseMessage response = await client.GetAsync("");
        if (response.IsSuccessStatusCode)
        {
            var jsonData = await response.Content.ReadAsStringAsync();
            return JToken.Parse(jsonData);
        }
    }
    return null;
}

async private void button1_Click(object sender, EventArgs e)
{
    var jObj = await GetREST("https://covid19.mathdro.id/api");
    var confirmed = jObj["confirmed"];
    Console.WriteLine("Confirmed:" + confirmed["value"]);
    var confirmedJSON = await GetREST(confirmed["detail"].ToString());
    Console.WriteLine(confirmedJSON);
}

答案 1 :(得分:1)

除了可接受的答案外,您始终可以通过反序列化将数据作为对象来处理-与使用fileText等相比,我更喜欢这种方法,因为它往往很容易处理对象(通常更少样板以从响应中提取数据位。

JToken

要反序列化的对象如下所示:

        public async Task<CovidData> GetCovidData(string uri)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(uri);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response = await client.GetAsync("");
                if (response.IsSuccessStatusCode)
                {
                    var jsonData = await response.Content.ReadAsStringAsync();
                    return JsonConvert.DeserializeObject<CovidData>(jsonData);
                }
            }
            return null;
        }

它确实确实取决于首选项和您的用例。

示例:

    public class CovidData
    {
        public ValueDetailPair Confirmed { get; set; }

        public ValueDetailPair Recovered { get; set; }

        public ValueDetailPair Deaths { get; set; }
    }

    public class ValueDetailPair
    {
        public int Value { get; set; }

        // If you need the link to the detail it would be deserialized to this string member
        public string Detail { get; set; }
    }
相关问题