c# - 如何发出 GET 请求并将结果解析到列表

标签 c# asp.net asp.net-mvc parsing filehelpers

数据包含 place_id 和其他列:

place_id    name    city    address ..
133 place1  Laagri  Born 12 ..
161 place2  Mourdi  Karve 12  ..

数据有 5 种不同的格式。所有这些网址都返回相同的数据:

http://www.smartpost.ee/places.html
http://www.smartpost.ee/places.xml
http://www.smartpost.ee/places.csv
http://www.smartpost.ee/places.js
http://www.smartpost.ee/places.php

应选择其中一个网址来获取数据。数据可能会发生变化,因此不应缓存。 如何发出 http GET 请求并创建两个元素列表:第一个元素是第一列中的 place_id,第二个元素是连接的名称、城市和地址字段。像这样的东西:

class DeliveryList {
   public string Id, Address;
  }

List<DeliveryList> res= GetAndParse("http://www.smartpost.ee/places.csv", 
    "place_id, name+\" \"+ city +\" \" + address" );

如何实现GetAndParse?是否应该将 http 请求保存到 sting 并使用 filehelpers 来解析它?表达式 "place_id, name+\"\"+ city +\"\"+ address" 可以在代码中硬编码,而不是作为参数传递。

使用 ASP.NET MVC4、.NET 4、C# .代码应在服务器中的 MVC4 Controller 中运行。

最佳答案

我建议您使用 XML 端点并对位置数组实现反序列化,如下所示:

public static class PlacesHelper
{
    private const string EndpointUrl = "http://www.smartpost.ee/places.xml";

    /// <summary> Load array of places </summary>
    public static async Task<Places> LoadPlacesAsync()
    {
        var xmlString = await HttpRequestHelper.DownloadStringAsync(EndpointUrl);
        return SerializationHelper.DeserializeXmlString<Places>(xmlString);
    }
}

public static class SerializationHelper
{
    /// <summary> Deserializes Xml string of type T. </summary>
    public static T DeserializeXmlString<T>(string xmlString)
    {
        T tempObject = default(T);

        using (var memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
        {
            var xs = new XmlSerializer(typeof (T));
            var xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

            tempObject = (T) xs.Deserialize(memoryStream);
        }

        return tempObject;
    }

    /// <summary> Convert String to Array </summary>
    private static Byte[] StringToUTF8ByteArray(String xmlString)
    {
        return new UTF8Encoding().GetBytes(xmlString);
    }
}

public static class HttpRequestHelper
{
    /// <summary> Download String Async </summary>
    public static async Task<string> DownloadStringAsync(string uri)
    {
        var client = new WebClient();
        return await client.DownloadStringTaskAsync(uri);
    }
}

[Serializable]
[XmlRoot("places_info", Namespace = "")]
public class Places
{
    [XmlElement("place", typeof(Place), Form = XmlSchemaForm.Unqualified, IsNullable = false)]
    public Place[] Place { get; set; }
}

[Serializable]
public class Place
{
    [XmlElement("place_id")]
    public string Id { get; set; }

    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("city")]
    public string City { get; set; }

    [XmlElement("address")]
    public string Address { get; set; }
}

用法:

var arrayOfPlaces = await PlacesHelper.LoadPlacesAsync();

因此,您将获得一系列地点(ID、名称、城市、地址)。

更新:

对于 .NET Framework 4 Microsoft 发布了 Async Targeting Pack (Microsoft.Bcl.Async)通过Nuget 。因此,从 Nuget 安装“Microsoft Async”包,您将能够使用 async/await。

Controller 操作的示例实现:

public class TestController : Controller
{
    public async Task<object> GetPlaces()
    {
        return Json(await PlacesHelper.LoadPlacesAsync(), JsonRequestBehavior.AllowGet);
    }
}

关于c# - 如何发出 GET 请求并将结果解析到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809885/

相关文章:

asp.net - 如果页面作为弹出窗口打开,是否可以隐藏 ASP.NET 母版页的内容?

c# - Kendo UI - 2 个日期之间的网格/过滤器菜单自定义

c# - 这是不推荐使用的编码方式吗? ASP.Net MVC

c# - 如何遍历所有控件(包括 ToolStripItems)C#

c# - 如何使用 autofac 注册两个 WCF 服务契约(Contract)

C# 存储库 - 如何与其他存储库交互

c# - 在 azure 上移动 asp.net Web 表单网站,无需再次编码即可使用 azure blob 存储

c# - 子类可以实现与其父类相同的接口(interface)吗?

c# - 旋转时相机抖动(而非移动)

c# - 如何在 mvc4 razor 中显示验证消息