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

效果如下:

REST: C#调用REST API (zz)的更多相关文章

  1. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  2. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

  3. 使用Python调用Flickr API抓取图片数据

    Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...

  4. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  5. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  6. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  7. 【转】用C#调用Windows API向指定窗口发送

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

  8. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  9. ASP.NET MVC4中调用WEB API的四个方法

    http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...

随机推荐

  1. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  2. 饭团(1):用NABCD大法为项目奠基

    上一篇文章:提升效率的开发工具 提到高效的开发工具就像催化剂,加速项目开发.这篇文章提到的NABCD大法,就像一份地图,指引项目往正确的方法上发展. 选择比努力更重要.一个项目成功自然离不开码农们的努 ...

  3. hibernate查询方式

    hibernate查询方式:1.本地SQL查询 2.HQL查询 3.QBC查询 HQL查询:是面向对象的查询语言,是使用最广的一种查询方法 QBC查询:Query by Criteria是一套接口来实 ...

  4. C语言杂谈(三)存储类别

    本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...

  5. WCF MSMQ消息队列与离线操作

    消息队列类型 公共队列:整个网络中的节点都可以访问到 专用队列:本地计算机,知道路径者可以访问 管理队列:包含确认在给定“消息队列”网络中的发送的消息回执的消息 相应队列:返回给发送程序的相应信息

  6. lvs realserver 配置VIP

    # $# 表示提供到shell脚本或者函数的参数总数: # 1表示只有一个参数. #/bin/bash #file: tun_RS.sh if [ $# -ne 1 ]; then echo “usa ...

  7. nopcommerce之权限模块

    这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce里面的权限设计相对比较简单,主要针对后台的action和前台的是否显示(比如产品.品牌等),虽然简单但是应付一般的项目应该没 ...

  8. zookeeper中Watcher和Notifications

    问题导读:1.zookeeper观察者什么时候调用?2.传统远程轮询服务存在什么问题?3.zk中回调服务的机制是什么?4.zk中watcher为什么不永久注册?5.什么是znode? 在阅读之前首先明 ...

  9. FDTD扩展到所有频率

  10. hihocoder-1389&&2016北京网赛07 Sewage Treatment(二分+网络流)

    题目链接: Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people could ...