简单易用的Rest

简介: 今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地。

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




目录
相关文章
|
1月前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
2月前
|
缓存 监控 前端开发
利用GraphQL提升API开发效率
【10月更文挑战第10天】本文介绍了GraphQL的核心概念、优势及其实现步骤,探讨了其在现代开发中的应用,包括动态数据需求、单页应用和微服务架构。通过缓存策略、批处理、安全性和监控等实战技巧,提升API开发效率和用户体验。
|
6月前
|
设计模式 缓存 JavaScript
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
148 0
|
7月前
|
缓存 前端开发 API
构建可扩展的API:REST vs GraphQL
【5月更文挑战第14天】在API设计中,REST和GraphQL是两种主要的架构风格。REST基于HTTP协议,强调资源的无状态性和客户端-服务器模型,适合简单CRUD操作。而GraphQL提供更灵活的数据查询,允许客户端精确指定需求,减少HTTP请求和数据冗余,适合复杂场景和高性能需求。选择时要考虑项目需求、技术栈、性能和团队经验。
|
3月前
|
API 网络架构 微服务
探索 GraphQL:现代 API 开发的新范式
GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,避免了传统 RESTful API 中的数据冗余问题。它由 Facebook 开发并开源,现广泛应用于现代 Web 和移动应用。本文将介绍 GraphQL 的核心概念、优势及其在不同场景下的应用,并指导你如何构建和优化 GraphQL API。
|
7月前
|
安全 前端开发 API
深入理解与实践GraphQL:构建高效、灵活的API
在本文中,我们将探索GraphQL这一强大的API查询语言及其运行原理。不同于传统的RESTful API设计,GraphQL提供了一种更加高效、灵活的方式来交互数据。通过实例和比较,本文旨在揭示GraphQL如何使前端和后端开发更加紧密协作,同时减少数据传输的冗余。我们将从GraphQL的基本概念入手,深入到查询(Queries)、变更(Mutations)和订阅(Subscriptions)的实现,最后探讨如何在实际项目中部署和优化GraphQL服务。此外,本文还将简要介绍如何利用现有的GraphQL工具和库来加速开发过程。
|
7月前
|
缓存 监控 安全
构建高效可扩展的RESTful API:后端开发的实战指南
在数字化转型的浪潮中,后端API的设计和实现成为连接数据与服务的关键枢纽。本文深入探讨了构建高效、可扩展的RESTful API的实践方法,涵盖了从基本设计原则到性能优化技巧的多个方面。通过分析真实案例,文章将提供一套系统的解决方案框架,帮助开发者提升API的稳定性、可维护性和响应速度,同时保证服务的高可用性和安全性。
|
7月前
|
XML JSON API
浅谈6种流行的API架构风格
浅谈6种流行的API架构风格
143 0
分布式系统核心:REST风格的架构,REST成熟度模型及REST API管理
正如前文所述,正确、完整地使用REST是困难的,关键在于RoyFielding所定义的REST只是一种架构风格,它并不是规范,所以也就缺乏可以直接参考的依据。好在Leonard Richardson补充了这方面的不足。
|
SQL 存储 缓存
了解API相关范式(RPC、REST、GraphQL)
了解API相关范式(RPC、REST、GraphQL) 前言 两个独立的应用程序经常需要相互访问交谈,或则可以是同一个应用程序,但部署在不同的服务器,或者现在常用的前后端分离式架构等等需要经常相互访问交谈,因此开发人员经常搭建桥梁API(Application Programming Interfaces) 关于API的定义,你可以简单看看这篇文章-- What is an API: Definition, Types, Specifications, Documentation
239 0