CnPlayer

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 669|回复: 0

[转帖] 简单易用的Rest

[复制链接]

72

主题

101

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051
发表于 2018-7-26 14:44:35 | 显示全部楼层 |阅读模式
转自:https://blog.csdn.net/chinacsharper/article/details/21256569
简单易用的Rest
2014年03月14日 22:27:43阅读数:12209


今天碰巧,用到了淘宝的在线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中的Web 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非常简单易用呢?






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|玩儿家 ( 京ICP备16001541号-1 )

GMT+8, 2018-12-16 16:21 , Processed in 0.058048 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表