zoukankan      html  css  js  c++  java
  • REST: C#调用REST API (zz)

    由于辞职的原因,最近正在忙于找工作。在这段期间收到了一家公司的上机测试题,一共两道题,其中一道题是关于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 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 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 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;
                    
                }
            }
        
    
            
    
            
        }
    }
    

    效果如下:



     



  • 相关阅读:
    IDEA安装scala搭建项目环境
    安装配置Maven和创建Java项目
    IDEA 2019.2的安装破解教程
    GroupBy
    C#快速傅立叶变换(Fast Fourier Transform)
    多种方式收费解决方案
    随机数生成算法
    C#生成随机数的三种方法
    统治世界的十大算法,你都了解多少?
    VR和AR技术是什么意思 二者有什么区别详解
  • 原文地址:https://www.cnblogs.com/strinkbug/p/5016197.html
Copyright © 2011-2022 走看看