原文地址: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

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

  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的宿主程序,先建立一个类库项目,里面的代码如下。

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

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

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

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

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

接着在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. <system.serviceModel>
  7. <services>
  8. <service name="Service.AddressService">
  9. <endpoint address="http://127.0.0.1:8888/addresses"
  10. binding="webHttpBinding"
  11. contract="Service.Interface.IAddress"/>
  12. </service>
  13. </services>
  14. </system.serviceModel>
  15. </configuration>

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

  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文件中配置一下这个服务(也可以在代码中通过硬编码的方式进行)。

  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>

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

客户端代码:

  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. if (address != null)
  12. {
  13. Console.WriteLine(string.Format("IP来自{0},{1}",address.Province,address.City));
  14. }
  15. }
  16. }
  17. }
  18. }

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

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

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

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

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

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

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

C# 发布REST接口地址API服务的更多相关文章

  1. 开放接口/RESTful/Api服务的设计和安全方案

    总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...

  2. 开放接口/RESTful/Api服务的设计和安全方案详解

    一.总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名 ...

  3. 调用jersey发布的接口webservice,通过HttpPost传递文件

    项目媒体文件之前都是上传到七牛云处理,现在客户为了安全和私密性,准备将移动端拍摄的图片和视频传递到文件服务器,所以就想办法能不能在服务器端发布一个WebService,供移动端调用.刚好之前做的接口都 ...

  4. Linux虚拟机:发布WebService接口出现异常,无法访问接口

    Linux虚拟机:发布WebService接口出现异常,无法访问接口 今天在部署WebService工程的时候遇到的问题: 在Linux虚拟机上部署一个tomcat同时在tomcat下放置2个工程,其 ...

  5. vue config.js配置生产环境和发布环境不同的接口地址问题

    第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...

  6. VUE 利用webpack 给生产环境和发布环境配置不同的接口地址

    第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...

  7. VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址

    转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...

  8. vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。

    废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.e ...

  9. 汇总博客常见的api接口地址(windows live write)

    汇总博客常见的api接口地址(windows live write) 1. cnblogs 日志地址,直接输入 http://www.cnblogs.com/xxxxx/ api接口 http://w ...

随机推荐

  1. 聊聊clean code

    clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...

  2. [leetcode]Sort List @ Python

    原题地址:http://oj.leetcode.com/problems/sort-list/ 题意:链表的排序.要求:时间复杂度O(nlogn),空间复杂度O(1). 解题思路:由于题目对时间复杂度 ...

  3. Search in Rotated Sorted Array II leetcode java

    题目: Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would ...

  4. MediaPlayer 状态机 API 详解 示例

    简介 public class android.media.MediaPlayer extends Object implements VolumeAutomation 可能需要的权限: One ma ...

  5. 火速提升Android仿真器的运行速度 ——仿真器Genymotion

    一.问题概述 Android开发中会使用仿真器测试应用,但不管你使用Eclispe ADT还是Android Studio仿真器都是基于arm架构的,运行起来都很慢,光启动就要花费很多时间,都不知道它 ...

  6. ADB用法

    作为android开发人员,adb是常用的工具之一.具体怎么使用了. 1. 安装完ADB后(ADB的安装请参考<Android开发平台搭建及配置.doc>),用电脑USB连接机器,然后使用 ...

  7. Bootstrap全局CSS样式之表格

    .table--基础表格样式. .table-striped--给<tbody>之内的每一行添加斑马条纹样式: .table-bordered--为表格添加边框: .table-hover ...

  8. 火狐浏览器Firefox Firefox中的xpi文件是什么

    firefox中的xpi文件是什么? 问一下 最佳答案 XPI是什么? firefox中的xpi实际上类似于IE中的插件或扩展(如Flash插件等). 格式一般为.Zip, 由XUL.Javascri ...

  9. 新浪微博SSO登陆机制(转载)

    原文地址: http://www.cnblogs.com/AloneSword/p/3840548.html 最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn ...

  10. ZH奶酪:PHP安装扩展imagick

    明明几个简单命令就能搞定,但是按照网上的方法就是不行,弄了一天,最后发现只需要两行命令,而且不需要修改什么php.ini: sudo apt-get install php5-imagick sudo ...