zoukankan      html  css  js  c++  java
  • 简单易用的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());  
            }  
        }  
    }  
    View Code

    运行它可以看到:

    关于如何解码u4e2du56fd这样的字符串,可以参考我的这篇博文: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; }
        }
    }
    View Code

    很简单,就是定义了一个契约,用于获取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);  
            }  
        }  
    }  
    View Code

    接着在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>  
    View Code

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

    namespace Service  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                using (WebServiceHost host = new WebServiceHost(typeof(AddressService)))  
                {  
                    host.Open();  
                    Console.Read();  
                }  
            }  
        }  
    }  
    View Code

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

    服务端准备好,我们写一下客户端的调用代码,在控制台应用程序中测试一下这个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>  
    View Code

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

    客户端代码:

    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));  
                    }  
                }  
            }  
        }  
    }  
    View Code

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

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

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

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

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

    [ServiceContract]  
    public interface IAddress  
    {  
        [WebGet(UriTemplate = "ip={ip}", ResponseFormat = WebMessageFormat.Json)]  
        Address Get(string ip);  
    }  
    View Code

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

  • 相关阅读:
    征战蓝桥 —— 2017年第八届 —— C/C++A组第7题——正则问题
    征战蓝桥 —— 2017年第八届 —— C/C++A组第7题——正则问题
    征战蓝桥 —— 2017年第八届 —— C/C++A组第7题——正则问题
    征战蓝桥 —— 2017年第八届 —— C/C++A组第8题——包子凑数
    征战蓝桥 —— 2017年第八届 —— C/C++A组第8题——包子凑数
    征战蓝桥 —— 2017年第八届 —— C/C++A组第8题——包子凑数
    征战蓝桥 —— 2017年第八届 —— C/C++A组第9题——分巧克力
    征战蓝桥 —— 2017年第八届 —— C/C++A组第9题——分巧克力
    征战蓝桥 —— 2017年第八届 —— C/C++A组第9题——分巧克力
    征战蓝桥 —— 2017年第八届 —— C/C++A组第10题——油漆面积
  • 原文地址:https://www.cnblogs.com/guwei4037/p/3601504.html
Copyright © 2011-2022 走看看