简单易用的Rest
今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地。数据库比较庞大,准确性也比较高。地址为:http://ip.taobao.com/instructions.php。
这是一个GET请求的接口,使用方式很简单,只要将这个URL复制到浏览器的地址栏就可以了。
可以看到接口返回的是一串JSON格式的字符串。关于如何解析JSON,参考我的这篇博文:http://blog.csdn.net/chinacsharper/article/details/9246627。
那么如何在程序中实现呢?我们新建一个控制台应用程序,并键入如下代码:
namespace RestServiceApp
{
class Program
{
static void Main(string[] args)
{
string url = "http://ip.taobao.com/service/getIpInfo.php?ip=210.75.225.254";
HttpWebRequest request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
}
}
}
运行它可以看到:
关于如何解码\u4e2d\u56fd这样的字符串,可以参考我的这篇博文:http://blog.csdn.net/chinacsharper/article/details/9885165。
好了,如何调用这个淘宝IP地址的接口就到这,不过我由此想到了两个东西,一个是WCF Rest,一个是ASP.NET MVC中的Rest Api,这里先介绍一下WCF Rest。
我们在前文也简单的讲解过如何使用WCF,WCF最关键的要素就是A(Address地址)、B(Binding绑定)、C(Contract契约)。为了便于演示,我们直接用控制台应用程序作为WCF Rest的宿主程序,先建立一个类库项目,里面的代码如下。
namespace Service.Interface
{
[ServiceContract]
public interface IAddress
{
[WebGet(UriTemplate = "ip={ip}")]
Address Get(string ip);
} [DataContract]
public class Address
{
[DataMember]
public string IPAddress { get; set; } [DataMember]
public string Province { get; set; } [DataMember]
public string City { get; set; }
}
}
很简单,就是定义了一个契约,用于获取IP地址信息。需要说明一下,这个项目需要引用System.ServiceModel和System.Runtime.Serialization这两个dll。
接下来就是要创建一个WCF Rest服务端程序,用以提供服务。
先定义一个类AddressService,并实现我们刚刚定义的IAddress接口。
namespace Service
{
public class AddressService : IAddress
{
private static IList<Address> addresses = new List<Address>(); static AddressService()
{
//这里可以准备一个IP地址库并放入到IP地址列表中,以提供数据服务
addresses.Add(new Address() { IPAddress = "210.75.225.254", Province = "上海市", City = "上海市" });
} public Address Get(string ipAddress)
{
return addresses.FirstOrDefault(x => x.IPAddress == ipAddress);
}
}
}
接着在App.config配置文件中添加配置信息。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <system.serviceModel>
<services>
<service name="Service.AddressService">
<endpoint address="http://127.0.0.1:8888/addresses"
binding="webHttpBinding"
contract="Service.Interface.IAddress"/>
</service>
</services>
</system.serviceModel>
</configuration>
最后在Main方法中添加如下代码。
namespace Service
{
class Program
{
static void Main(string[] args)
{
using (WebServiceHost host = new WebServiceHost(typeof(AddressService)))
{
host.Open();
Console.Read();
}
}
}
}
然后我们就可以运行这个控制台项目了。注意:运行程序时,请确保你当前的用户为操作系统管理员用户。
服务端准备好,我们写一下客户端的调用代码,在控制台应用程序中测试一下这个WCF Rest服务。
同样的,我们需要先在客户端的App.config文件中配置一下这个服务(也可以在代码中通过硬编码的方式进行)。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint name="addressService"
address="http://127.0.0.1:8888/addresses"
binding="webHttpBinding"
contract="Service.Interface.IAddress" />
</client>
</system.serviceModel>
</configuration>
这里要注意,绑定模型要跟服务端模型一致,否则会有绑定不匹配的异常产生。
客户端代码:
namespace RestServiceApp
{
class Program
{
static void Main(string[] args)
{
using (ChannelFactory<IAddress> channelFactory = new ChannelFactory<IAddress>("addressService"))
{
IAddress iAddress = channelFactory.CreateChannel();
Address address = iAddress.Get("210.75.225.254"); if (address != null)
{
Console.WriteLine(string.Format("IP来自{0},{1}",address.Province,address.City));
}
}
}
}
}
保证之前建立的服务端程序在运行状态,然后我们运行一下这个客户端程序:
可以看到,我们调用WCF Rest服务成功的获得了IP地址的详细信息。
既然是Get请求型的Rest服务,那么应该可以在浏览器中直接调用,我们打开浏览器输入地址。
同样的获得了XML类型的数据。
那如果我们想提供JSON格式的数据给别人呢?很简单,只要在定义接口方法时,指定数据返回的格式即可。
[ServiceContract]
public interface IAddress
{
[WebGet(UriTemplate = "ip={ip}", ResponseFormat = WebMessageFormat.Json)]
Address Get(string ip);
}
看到这里,你是否觉得Rest非常简单易用呢?
简单易用的Rest的更多相关文章
- FineBI:一个简单易用的自助BI工具
过去,有关企业数据分析的重担都压在IT部门,传统BI分析更多面向的是具有IT背景的人员.但随着业务分析需求的增加,很多公司都希望为业务用户提供自助分析服务,将分析工作落实到业务人员手中.但同时,分析工 ...
- DataAccess通用数据库访问类,简单易用,功能强悍
以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...
- 快速上手seajs——简单易用Seajs
快速上手seajs——简单易用Seajs 原文 http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...
- [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS
[.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS 本篇要点:在进阶篇快要结束的时候说说源代码管理器,我们的开发,不是一个人可以完成的事,团队协作很重要,而且 ...
- 设计与开发一款简单易用的Web报表工具(支持常用关系数据及hadoop、hbase等)
EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询出的行列结构转换成HTML表格(Table),并支持表格的跨行(Ro ...
- 分享一个简单易用的RPC开源项目—Tatala
http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...
- ZOOM - 简单易用的 jQuery 照片相册插件
jQuery 最令人印象深刻的应用之一就是对图片的处理,它可以让帮助你在你的项目中加入一些让人惊叹的图片切换效果.ZOOM 是一款全屏效果的 jQuery 图片切换展示插件,支持键盘前后按键切换,支持 ...
- BasicModal - 简单易用的现代 Web App 弹窗
BasicModal 是为现代 Web 应用程序打造的弹窗系统.它包括所有你需要显示的信息,问题或接收用户的输入.这里的弹窗还可以链接起来,所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框. ...
- PNotify – 简单易用的 JS 通知,消息提示插件
PNotify 是一个 JavaScript 通知插件,前身为 Pines Notify.它旨在提供无与伦比的灵活性,同时很容易使用.它可以提供无阻塞的通知,允许用户无需关闭通知或者提示信息就可以点击 ...
- Echo.js – 简单易用的 JavaScript 图片延迟加载插件
Echo.js 是一个独立的延迟加载图片的 JavaScript 插件.Echo.js 不依赖第三方库,压缩后不到1KB大小. 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视 ...
随机推荐
- CRM-BP相关FUNCTION
获取BP的地址信息:BUPA_ADDRESS_GET_DETAIL 修改BP的信息:CRM_WAP_BP_CHANGE BUTO50存放2个BP之间的关系 获取BP的角色 BAPI_BUPA_ROLE ...
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- 文件I/O(不带缓冲)之open函数
调用open函数可以打开或创建一个文件. #include <fcntl.h> int open( const char *pathname, int oflag, ... /* mode ...
- 插件就是生产力——那些不能错过的XCode插件们
古人云"工欲善其事必先利其器",打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径! 晾一下我的武器库,欢迎大家选用:) 全能搜索家CodePilot 2.0 -------- ...
- SQL 四种连接:内连接、左外连接、右外连接、全连接--转载
原文:http://zwdsmileface.iteye.com/blog/2191730 个人理解 内连接(INNER JOIN)(典型的连接运算,使用像 = 或 <> ...
- VB.NET中使用代表对方法异步调用
按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? ...
- Hibernate - list()和iterate()的区别
list()和iterate()都可以用来获得Query取得的HQL结果list()使用的是即时加载.查询时会之前去数据库查询HQL并将所有结果存在缓存中.iterate()使用的是延时加载.查询时只 ...
- php验证码制作
目标: 使用php生成验证码 成品: 逻辑代码: authcode.php <?php header("Content-type:image/png"); session_s ...
- F5中源地址转换(AutoMap)模式下后端服务器获取客户端真正的IP地址
F5中开启AutoMap,并传递X-Forwarded-For值 开启F5源地址转换"Auto Map" 方式一: 在http profile中开启X-Forwarded-For ...
- innodb对update的处理
当更新非聚集索引上记录 和 聚集索引上的主键时,是标记删除,然后插入新的记录 当更新聚集索引上的非主键列时,是updated-in-place,也就是说原地修改,不会插入新记录. 之前一直以为都是以标 ...