天下之事,必先处之难,而后易之。

C# 发布REST接口地址API服务

原文地址:https://blog.csdn.net/chinacsharper/article/details/21256569

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

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

可以看到接口返回的是一串JSON格式的字符串。关于如何解析JSON,参考我的这篇博文:http://blog.csdn.net/chinacsharper/article/details/9246627

那么如何在程序中实现呢?我们新建一个控制台应用程序,并键入如下代码:

[csharp] view plain copy
  1. namespace RestServiceApp  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             string url = "http://ip.taobao.com/service/getIpInfo.php?ip=210.75.225.254";  
  8.             HttpWebRequest request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));  
  9.             WebResponse response = request.GetResponse();  
  10.             StreamReader reader = new StreamReader(response.GetResponseStream());  
  11.             Console.WriteLine(reader.ReadToEnd());  
  12.         }  
  13.     }  
  14. }  

运行它可以看到:

关于如何解码\u4e2d\u56fd这样的字符串,可以参考我的这篇博文:http://blog.csdn.net/chinacsharper/article/details/9885165

好了,如何调用这个淘宝IP地址的接口就到这,不过我由此想到了两个东西,一个是WCF Rest,一个是ASP.NET MVC中的Web Api,这里先介绍一下WCF Rest。

我们在前文也简单的讲解过如何使用WCF,WCF最关键的要素就是A(Address地址)、B(Binding绑定)、C(Contract契约)。为了便于演示,我们直接用控制台应用程序作为WCF Rest的宿主程序,先建立一个类库项目,里面的代码如下。

[csharp] view plain copy
  1. namespace Service.Interface  
  2. {  
  3.     [ServiceContract]  
  4.     public interface IAddress  
  5.     {  
  6.         [WebGet(UriTemplate = "ip={ip}")]  
  7.         Address Get(string ip);  
  8.     }  
  9.   
  10.     [DataContract]  
  11.     public class Address  
  12.     {  
  13.         [DataMember]  
  14.         public string IPAddress { get; set; }  
  15.   
  16.         [DataMember]  
  17.         public string Province { get; set; }  
  18.   
  19.         [DataMember]  
  20.         public string City { get; set; }  
  21.     }  
  22. }  

很简单,就是定义了一个契约,用于获取IP地址信息。需要说明一下,这个项目需要引用System.ServiceModel和System.Runtime.Serialization这两个dll。

接下来就是要创建一个WCF Rest服务端程序,用以提供服务。

先定义一个类AddressService,并实现我们刚刚定义的IAddress接口。

[csharp] view plain copy
  1. namespace Service  
  2. {  
  3.     public class AddressService : IAddress  
  4.     {  
  5.         private static IList<Address> addresses = new List<Address>();  
  6.   
  7.         static AddressService()  
  8.         {  
  9.             //这里可以准备一个IP地址库并放入到IP地址列表中,以提供数据服务  
  10.             addresses.Add(new Address() { IPAddress = "210.75.225.254", Province = "上海市", City = "上海市" });  
  11.         }  
  12.   
  13.         public Address Get(string ipAddress)  
  14.         {  
  15.             return addresses.FirstOrDefault(x => x.IPAddress == ipAddress);  
  16.         }  
  17.     }  
  18. }  

接着在App.config配置文件中添加配置信息。

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <startup>  
  4.     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
  5.   </startup>  
  6.   
  7.   <system.serviceModel>  
  8.     <services>  
  9.       <service name="Service.AddressService">  
  10.         <endpoint address="http://127.0.0.1:8888/addresses"  
  11.                   binding="webHttpBinding"  
  12.                   contract="Service.Interface.IAddress"/>  
  13.       </service>  
  14.     </services>  
  15.   </system.serviceModel>  
  16. </configuration>  

最后在Main方法中添加如下代码。

[csharp] view plain copy
  1. namespace Service  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             using (WebServiceHost host = new WebServiceHost(typeof(AddressService)))  
  8.             {  
  9.                 host.Open();  
  10.                 Console.Read();  
  11.             }  
  12.         }  
  13.     }  
  14. }  

然后我们就可以运行这个控制台项目了。注意:运行程序时,请确保你当前的用户为操作系统管理员用户。

服务端准备好,我们写一下客户端的调用代码,在控制台应用程序中测试一下这个WCF Rest服务。

同样的,我们需要先在客户端的App.config文件中配置一下这个服务(也可以在代码中通过硬编码的方式进行)。

[csharp] view plain copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <startup>  
  4.     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
  5.   </startup>  
  6.   <system.serviceModel>  
  7.     <client>  
  8.       <endpoint name="addressService"  
  9.                  address="http://127.0.0.1:8888/addresses"  
  10.                  binding="webHttpBinding"  
  11.                  contract="Service.Interface.IAddress" />  
  12.     </client>  
  13.   </system.serviceModel>  
  14. </configuration>  

这里要注意,绑定模型要跟服务端模型一致,否则会有绑定不匹配的异常产生。

客户端代码:

[csharp] view plain copy
  1. namespace RestServiceApp  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             using (ChannelFactory<IAddress> channelFactory = new ChannelFactory<IAddress>("addressService"))  
  8.             {  
  9.                 IAddress iAddress = channelFactory.CreateChannel();  
  10.                 Address address = iAddress.Get("210.75.225.254");  
  11.   
  12.                 if (address != null)  
  13.                 {  
  14.                     Console.WriteLine(string.Format("IP来自{0},{1}",address.Province,address.City));  
  15.                 }  
  16.             }  
  17.         }  
  18.     }  
  19. }  

保证之前建立的服务端程序在运行状态,然后我们运行一下这个客户端程序:

可以看到,我们调用WCF Rest服务成功的获得了IP地址的详细信息。

既然是Get请求型的Rest服务,那么应该可以在浏览器中直接调用,我们打开浏览器输入地址。

同样的获得了XML类型的数据。

那如果我们想提供JSON格式的数据给别人呢?很简单,只要在定义接口方法时,指定数据返回的格式即可。

[csharp] view plain copy
  1. [ServiceContract]  
  2. public interface IAddress  
  3. {  
  4.     [WebGet(UriTemplate = "ip={ip}", ResponseFormat = WebMessageFormat.Json)]  
  5.     Address Get(string ip);  
  6. }  

看到这里,你是否觉得Rest非常简单易用呢?

 

posted @ 2018-05-07 10:50  boonya  阅读(7062)  评论(0编辑  收藏  举报
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。