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。
那么如何在程序中实现呢?我们新建一个控制台应用程序,并键入如下代码:
- 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非常简单易用呢?
C# 发布REST接口地址API服务的更多相关文章
- 开放接口/RESTful/Api服务的设计和安全方案
总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...
- 开放接口/RESTful/Api服务的设计和安全方案详解
一.总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名 ...
- 调用jersey发布的接口webservice,通过HttpPost传递文件
项目媒体文件之前都是上传到七牛云处理,现在客户为了安全和私密性,准备将移动端拍摄的图片和视频传递到文件服务器,所以就想办法能不能在服务器端发布一个WebService,供移动端调用.刚好之前做的接口都 ...
- Linux虚拟机:发布WebService接口出现异常,无法访问接口
Linux虚拟机:发布WebService接口出现异常,无法访问接口 今天在部署WebService工程的时候遇到的问题: 在Linux虚拟机上部署一个tomcat同时在tomcat下放置2个工程,其 ...
- vue config.js配置生产环境和发布环境不同的接口地址问题
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...
- VUE 利用webpack 给生产环境和发布环境配置不同的接口地址
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...
- VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址
转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...
- vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。
废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.e ...
- 汇总博客常见的api接口地址(windows live write)
汇总博客常见的api接口地址(windows live write) 1. cnblogs 日志地址,直接输入 http://www.cnblogs.com/xxxxx/ api接口 http://w ...
随机推荐
- Java网络编程技术2
3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知 ...
- IDEA热部署基于maven的web项目
第一步:首先先创建web项目 按照向导一步一步完成项目创建,我创建的示例项目为hotdeploddemo 第二步:设置项目的web资源 下图中的路径要修改正确,指向src/ma ...
- 亚马逊AWS免费套餐EC2安装centos连接登录并创建root
前言:刚开始使用亚马逊的AWS的免费套餐EC2,由于个人习惯使用centos系统,所以果断安装,但是AWS为了安全性,默认禁止用户使用root账户,导致安装配置环境各种问题.所以我把从安好系统后遇到的 ...
- Redis自学笔记–Zset类型及管理简述
Zset类型 ...
- Druid对比Elasticsearch
我们不是Elasticsearch的专家, 如果描绘有误, 请通过邮件列表或者其他途径告知我们. Elasticsearch 是基于Apache Lucene搜索服务器. 提供了对无模式文档的全文检 ...
- [转载]Elasticsearch索引重建(Rebuild)
From:http://blog.csdn.net/changong28/article/details/38491185 索引重建(Rebuild) 索引创建后,你可以在索引当中添加新的类型,在类型 ...
- matlab中将矩阵按照行打乱顺序的一个例子
来自百度百科: A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12] rowrank = randperm(size(A, 1)); % 随机打乱的数字,从1~行数打 ...
- mysql时间操作函数和存储过程
因为业务须要统计一批数据.用到关于mysql的时间操作函数和存储过程,问题已经基本解决.把过程记录下: 1. mysql的语句中不支持直接用循环.循环仅仅能在存储过程中使用. 2. 写为文件时,注意一 ...
- [AngularJS] Angular 1.3 ngMessages with ngAnimate
Note: Can use $dirty to check whether user has intracted with the form: https://docs.angularjs.org/a ...
- [Node.js]27. Level 5: URL Building & Doing the Request
Let's create a page which calls the twitter search API and displays the last few results for Code Sc ...