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; }
} }
}
效果如下:

REST: C#调用REST API (zz)的更多相关文章
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
- 使用Python调用Flickr API抓取图片数据
Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API
新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...
- ASP.NET MVC4中调用WEB API的四个方法
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
随机推荐
- C语言-03-流程控制
一.选择结构 1> if语句 使用注意 ① if语句中的条件语句,不要把==和=弄混,可以把常量作为左值, 这样的话,在无用=的情况下,编译时会报错 ② if语句后若要定义新的变量或者有多条语句 ...
- python sorted用法
python列表排序 python字典排序 sorted List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, cmp=None, key ...
- linux crontab & 每隔10秒执行一次
linux下定时执行任务的方法 在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINU ...
- 用luke看索引
Luke是一个用于Lucene搜索引擎的第三方工具,它可以访问现有Lucene的索引,并允许您显示和修改.可以看每篇文档建立了哪些索引,验证有没有成功建立了索引.不然建立了,不能确定有没有成功. 可以 ...
- C# List与DataTable的相互转化
List与Data的转化比较简单,网上也很多.但是大多都有一个Bug:当实体类有可空类型的属性时,转化会出异常(DATASET不支持System.Nullable异常) 下面的方法可以避免出现这个问题 ...
- python数据结构-基本数据类型
- SQL Server服务器名称与默认实例名不一致的修复方法
SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...
- poj 3694 Network 边双连通+LCA
题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...
- zju 1937 初涉——深度优先搜索
#include "stdio.h" int a[11],b[11]; int k,flag,n,s; void DFS(); int main() { int i; while( ...
- 学习嵌入式Linux-选择iTOP-4412开发板
部分视频观看地址: [视频教程]iTOP-4412开发板之学习方法--致初学者 http://v.youku.com/v_show/id_XNzQ5MDA4NzM2.html [视频教程]三星Exyn ...