因为辞职的缘由,最近正在忙于找工做。在这段期间收到了一家公司的上机测试题,一共两道题,其中一道题是关于REST API的应用。虽然在面试时,我已经说过,不懂REST,但那面试PM仍是给了一道这题让我作。面试的PM仍是比较友好,没有限定时间,结果本身不争气,一边查资料一边作,一个多小时过了仍是没作出来,因此最后我放弃了,固然面试也就失败了。因而概括了一下失败的缘由,主要仍是对REST不了解,把REST当作Web Service的另外一种形式,先入为主的理解错误,必然会致使了失败。html
回归正传,什么是REST? 在此不详说。我说一下本身的理解吧。简单地说,REST就是一种基本HTTP请求服务从而达到操做资源的技术,其支持多种数据格式,好比xml、Json、Csv等等。Web Service是基本XML并利用SOAP协议实现远程资源访问操做的技术。所以,二者本质是是不一样的。也许个人理解不彻底正确,欢迎指出错误。web
下面来看看这道题,以下:面试
Userstory:
As a user I want to be able to see maximum, minimum and average predicted temperature for the following 3 days,
based on the city that needs to be entered.
Acceptance criteria:
Windows form application written in C#
One input field to define the city
A combobox to select Fahrenheit or Celcius degrees
Use free web service provided by http://www.worldweatheronline.com
The following key can be used to retrieve data : c6bbde7c9c021451123107
Show 'Retrieving weather data...' in status bar when request of data is submitted. Once data is retrieved
update status accordingly.
Use of linq statements to calculate the minimum, maximum and average temperature.
Main form needs to be responsive at all times
Use of delegates
Retrieval of data and UI logic needs to be seperated in code
Error handling when connectionapp
如下是我写的代码:ide
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO; using System.Xml; using System.Xml.Linq; using System.Threading; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Init(); } private void Init() { //初始化单位数据 List<object> list = new List<object>(); list.Add(new{key="Celsius", value="C"}); list.Add(new { key = "Fahrenheit", value = "F" }); cbUnit.DataSource = list; cbUnit.DisplayMember = "key"; cbUnit.ValueMember = "value"; cbUnit.SelectedIndex = 0; } private void btCalculate_Click(object sender, EventArgs e) { try { slStatus.Text = "Retrieving weather data....."; string city = tbCity.Text; string unit = cbUnit.SelectedValue.ToString(); Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("city", city); dic.Add("unit", unit); Thread thread = new Thread(new ParameterizedThreadStart(ThreadProcess)); thread.IsBackground = true; thread.Start(dic); } catch (Exception ex) { slStatus.Text = "获取数据失败...."; } } /// <summary> /// 后台处理线程 /// </summary> /// <param name="obj"></param> private void ThreadProcess(object obj) { Dictionary<string, string> dic = obj as Dictionary<string, string>; XDocument xmlDoc = GetData(dic["city"]); SetData(xmlDoc, dic["unit"]); slStatus.Text = ""; } /// <summary> /// 获取数据 /// </summary> /// <param name="city"></param> /// <returns></returns> private XDocument GetData(string city) { XDocument doc; Uri uri = new Uri(string.Format(@"http://free.worldweatheronline.com/feed/weather.ashx?q={0},china&format=xml&num_of_days=3&key=c6bbde7c9c021451123107",city)); HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(response.GetResponseStream()); string result=reader.ReadToEnd(); StringReader str = new StringReader(result); doc=XDocument.Load(str); } return doc; } /// <summary> /// 设置数据 /// </summary> /// <param name="doc"></param> /// <param name="unit"></param> private void SetData(XDocument doc,string unit) { var query = from p in doc.Root.Elements("weather") select new { Date = p.Element("date") == null ? null : p.Element("date").Value, MaxC = p.Element("tempMaxC") == null ? null : p.Element("tempMaxC").Value, MinC = p.Element("tempMinC") == null ? null : p.Element("tempMinC").Value, MaxF = p.Element("tempMaxF") == null ? null : p.Element("tempMaxF").Value, MinF = p.Element("tempMinF") == null ? null : p.Element("tempMinF").Value }; if (unit == "C") { CrossThreadAccess(tbMaximum, query.Max(p => p.MaxC)); CrossThreadAccess(tbMinimum, query.Min(p => p.MinC)); } else { CrossThreadAccess(tbMaximum, query.Max(p => p.MaxF)); CrossThreadAccess(tbMinimum, query.Min(p => p.MinF)); } CrossThreadAccess(tbAverage, Convert.ToString((Convert.ToInt32(tbMaximum.Text) + Convert.ToInt32(tbMinimum.Text)) / 2)); } /// <summary> /// UI线程间访问 /// </summary> /// <param name="control"></param> /// <param name="value"></param> private void CrossThreadAccess(Control control,string value) { if (control.InvokeRequired) { control.Invoke(new Action<Control, string>(CrossThreadAccess), control, value); } else { TextBox tb = control as TextBox; if (tb != null) tb.Text = value; } } } }
效果以下:测试