今天碰巧,用到了淘宝的在线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非常简单易用呢?
分享到:
相关推荐
rest_rpc高效易懂的RPC框架,有助于C++11学习,rest、rpc
rest_rpc是一个高性能、易用、跨平台、header only的c++11 rpc库,它的目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。 可以快速上手,使用者只需要关注自己的业务逻辑即可。 谁在用rest_...
> - 封装了HttpURLConnection,简单易用的API设计。 > - Debug模式下设置日志TAG,所有网络请求日志输出,方便调试。 gradle依赖 compile 'cn.alien95:resthttp:1.0.8' 使用 初始化:设置日志TAG public class ...
API REST简单en Laravel 药检合格证重设las cuentas POST /reset200 OK不存在的平衡GET /balance?account_id=1234404 0Crear cuenta con unbalance初始POST /event {"type":"deposit", "destination":"100", "amount...
OpenSkyline是一个OpenStack控制台项目,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单、易用、高效的OpenStack控制台。 基于REST API进行业务功能设计,功能模块化设计符合高内聚...
Restlet Client - REST API Testing,用来发送请求,可用于测试后端代码,简单易用
定时休眠 保护程序员研究 界面简单易用 官网上下载的
Hyperledger Fabric 提供了软件开发包/SDK以帮助开发者访问fabric网络和部署在网络上的链码,但是Hyperledger Fabric官方没有提供简单易用的REST API访问接口,在这个教程里我们将学习如何利用Hyperledger Fabric的...
易购 EaseApp是一个基于PHP的Micro Framework,可以以简单易用的方式帮助编写Web应用程序和REST API。
借助node.js的魔力,我们已经看到很多优秀的web测试框架,今天给大家分享的是Frisby.js从下面的测试示例中,我们可以看到Frisby能够提供了很多实用的测试方法,例如expectStatus,e Frisby 借助node.js的魔力,...
简单易用的用户界面可帮助您专注于API而不是工具。将您的请求和项目存储在Google云端硬盘上,并与您的团队共享。使用Anypoint Exchange连接到企业API,在请求之前和之后执行请求操作。它们允许从请求或重新放置数据...
Correios服务 可以简单地计算出钙的比例,然后再按比例添加到Correios。Motivação 想象一下,一个社区定义了melhor caminho,proprojecta eaplicaçãodos Correios,melhorando os fluxos de trabalho e tornando...
Rest-Assured是一个用于测试RESTful Web服务的Java库。它提供了一组简单易用的API,可以方便地对HTTP请求和响应进行操作,包括发送GET、POST、PUT、DELETE等请求,以及验证HTTP状态码、响应头和响应体等
已死的简单易用的存储模块,用于处理HTTP REST资源。 生成类型,操作和缩减器,以使您轻松与任何REST API进行交互。 使您不必编写大量样板代码,并确保您的代码保持。 需要处理异步操作。 依靠来执行HTTP请求。 ...
简单的RESTjs simpleRESTjs 是一个“简单易用”的基于 nodejs、expressjs 和 mongodb 的 REST Web 服务。 该工具的目标是允许开发人员测试需要将数据存储在云中并保持同步的 Web 和移动应用程序。 是一种简单的方法...
Appwrite是一个简单易用的后端用于前端和移动应用程序。 Appwrite为客户端(和服务器)开发人员提供了一组REST API,以加快应用程序开发时间。 适用于 [Flutter / Vue / Angular / React / iOS / Android / *ANY ...
RestNext是一个基于Netty框架(4.1.x)构建的框架(使用极其简单),该框架具有针对微服务的自动安全性和路由扫描方法。 RestNext的最大区别在于无需重新启动应用程序服务器即可注册/取消注册路由的能力以及路由的...
带有简单简洁的DSL的Discord机器人的Kotlin客户端 使用协程作为精益客户端构建,可通过干净且易于使用的SDK摆脱复杂的速率限制,异步和数据模型。 随时提交PR或问题,我会尽快解决。 使用Diskord? 给我发一条...
这是一个简单的库,用于处理猫鼬响应并使用 Express 在 REST API 中将它们转换为正确的 HTTP 状态 在不断改进中...... mongoose+express使用中的常见问题 网上有很多代码,你可以看到这样的东西(当err有错误处理...
一个命令行工具,用于运行简单纯文本格式定义的HTTP请求。它能够轻松处理HTML内容、REST / SOAP / GraphQL api或任何其他基于XML / JSON的api。Hurl的简单易用性使得处理HTTP请求变得更加便捷高效。