原文地址:https://blog.csdn.net/chinacsharper/article/details/21256569php
今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地。数据库比较庞大,准确性也比较高。地址为:http://ip.taobao.com/instructions.php。html

这是一个GET请求的接口,使用方式很简单,只要将这个URL复制到浏览器的地址栏就能够了。web

能够看到接口返回的是一串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中的Web Api,这里先介绍一下WCF Rest。url
咱们在前文也简单的讲解过如何使用WCF,WCF最关键的要素就是A(Address地址)、B(Binding绑定)、C(Contract契约)。为了便于演示,咱们直接用控制台应用程序做为WCF Rest的宿主程序,先创建一个类库项目,里面的代码以下。spa
- 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()
- {
-
- 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很是简单易用呢?