C#调用REST API

来源:互联网 发布:mac number 下拉菜单 编辑:程序博客网 时间:2024/05/21 01:29

因为告退的原因,比来正在忙于找工作。在这段时代收到了一家公司的上机测试题,一共两道题,此中一道题是关于REST API的应用。固然在口试时,我已经说过,不懂REST,但那口试PM还是给了一道这题让我做。口试的PM还是斗劲友爱,没有限按时候,成果本身不争气,一边查材料一边做,一个多小时过了还是没做出来,所以最后我放弃了,当然口试也就失败了。于是归纳了一下失败的原因,首要还是对REST不懂得,把REST当做Web Service的另一种情势,先入为主的懂得错误,必定会导致了失败。

回归正传,什么是REST? 在此不详说。我说一下本身的懂得吧。简单地说,REST就是一种根蒂根基HTTP恳求办事从而达到操纵资料的技巧,其支撑多种数据格局,比如xml、Json、Csv等等。Web Service是根蒂根基XML并哄骗SOAP和谈实现长途资料接见操纵的技巧。是以,两者本质是是不合的。也许我的懂得不完全正确,迎接指失足误。


下面来看看这道题,如下:


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 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
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 connection




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 REST_API2{    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 = "";            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;                            }        }                }}