这是从API检索数据的好方法吗?

时间:2019-03-05 12:50:18

标签: c#

有人可以告诉我这是否是从API检索数据的好方法吗? 我是新手,想知道是否有人可以向我推荐某种设置和结构,以及是否可以采用更正确的方式进行?

string baseUrl = "https://api.data.com/getITems/
//Create a new instance of HttpClient
using (HttpClient client = new HttpClient())
{
    var byteArray = Encoding.ASCII.GetBytes("username:password");
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
    using (HttpResponseMessage result = await client.GetAsync(baseUrl))
    using (HttpContent content = result.Content)
    {
        result.EnsureSuccessStatusCode();
        string data = await content.ReadAsStringAsync();

        var test1 = JsonConvert.DeserializeObject<Results>(data);

        foreach (var item in test1.results)
        {
            foreach (var item1 in item.result)
            {
                Console.WriteLine("Result: {0}", item1.Symbol);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您的代码看起来不错。您可以使用nuget包来简化某些操作,或者将其转换为帮助程序类。您唯一应该做的不同的事情不是每次都创建一个新的HttpClient,这违反了惯例。您只应创建一次并使用多次。

答案 1 :(得分:0)

由于我不知道您的要求,因此确定您的实现是否是一种好方法超出了我的范围,并且通常您可以始终将某些功能提取到其他类中,同时将您付出的努力与期望值进行比较摆脱它。

话虽这么说,我只会想起一件事,那就是您对HttpClient本身的使用。

如果这是一个寿命很长的应用程序,并且您继续调用代码的那一部分,则将始终新建HttpClient的新实例,然后进行处置。这将立即终止与端点的连接,但将端口保持在TIME_WAIT状态。 这样做是成百上千次,您很可能会遇到SocketException,因为您的计算机已经用完了可用的套接字。

documentation

  

HttpClient旨在实例化一次并在整个过程中重用   应用程序的生命周期。

如果所有HttpClient共享相同的标头和基地址,则可以在整个应用程序中重复使用该客户端的单个实例。如果您具有不同的标题,请创建一个新的静态客户端。 在这两种情况下,您都希望在整个应用程序中将它们作为单例使用。

一些进一步的阅读: