数据包含 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/