今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地。数据库比较庞大,准确性也比较高。地址为:http://ip.taobao.com/instructions.php。
这是一个GET请求的接口,使用方式很简单,只要将这个URL复制到浏览器的地址栏就可以了。
可以看到接口返回的是一串JSON格式的字符串。关于如何解析JSON,参考我的这篇博文:http://blog.csdn.net/chinacsharper/article/details/9246627。
那么如何在程序中实现呢?我们新建一个控制台应用程序,并键入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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中的Rest Api,这里先介绍一下WCF Rest。
我们在前文也简单的讲解过如何使用WCF,WCF最关键的要素就是A(Address地址)、B(Binding绑定)、C(Contract契约)。为了便于演示,我们直接用控制台应用程序作为WCF Rest的宿主程序,先建立一个类库项目,里面的代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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配置文件中添加配置信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
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方法中添加如下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
namespace
Service
{
class
Program
{
static
void
Main(
string
[] args)
{
using
(WebServiceHost host =
new
WebServiceHost(
typeof
(AddressService)))
{
host.Open();
Console.Read();
}
}
}
}
|
然后我们就可以运行这个控制台项目了。注意:运行程序时,请确保你当前的用户为操作系统管理员用户。
服务端准备好,我们写一下客户端的调用代码,在控制台应用程序中测试一下这个WCF Rest服务。
同样的,我们需要先在客户端的App.config文件中配置一下这个服务(也可以在代码中通过硬编码的方式进行)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
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
>
|
这里要注意,绑定模型要跟服务端模型一致,否则会有绑定不匹配的异常产生。
客户端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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格式的数据给别人呢?很简单,只要在定义接口方法时,指定数据返回的格式即可。
1
2
3
4
5
6
|
[ServiceContract]
public
interface
IAddress
{
[WebGet(UriTemplate =
"ip={ip}"
, ResponseFormat = WebMessageFormat.Json)]
Address Get(
string
ip);
}
|
看到这里,你是否觉得Rest非常简单易用呢?
本文转自 guwei4037 51CTO博客,原文链接:http://blog.51cto.com/csharper/1377039