您的位置:首页 > 移动开发 > Android开发

使用Retrofit和淘宝IP地址库查询IP

2016-04-10 17:05 561 查看

概述

Retrofit官方主页

Retrofit是为Java和Android打造的一个类型安全的HTTP客户端API。使得对Web方面知之甚少的开发者也可以方便地使用网络请求,省略了TCP复杂的过程,可以实现快速开发,高效使用。这篇博客记录了使用Retrofit从淘宝IP地址库查询IP地址信息的经过。免费的API,不需要注册,安利一波。

开发环境

Android Studio 1.5.1

Windows 10 64 bit

和github的正常稳定连接

开动

1.新建一个AS项目

2.修改xml文件

不需要什么UI,一个EditText,一个Button,一个TextView就好。可以把TextView弄得大一点,不然下面空一块好丑。

3.修改gradle依赖文件

要打开那个app目录下(Module:app后缀)

在里面添加以下几行:[添加前最好去检查一下更新,把版本号换成最新的]

compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'


解释一下这两行代码吧,第一行的信息在converter-gson ,从字面意思是“一个叫gson的转换器”,其实它的意思就是字面意思。gson是google的一个解析json的工具,可以把json的键值对映射到一个类里的对象。看过ip.taobao.com 就知道,服务器传回的是json数据,我们就是使用gson解析json。当然你也可以根据喜好选择其他的工具。第二行,很显然,自然就是建立和Retrofit框架的亲密关系了。

然后sync一下,依赖就添加好了。Retrofit相关文件会从网址上自己下好,用这段时间去在Activity里关联处理xml里的基本组件是个不错的选择。

代码时间

1.在manifest文件中声明网络权限。

<uses-permission android:name="android.permission.INTERNET" />


2.根据API信息适配框架

请求接口(GET):

/service/getIpInfo.php?ip=[ip地址字串]


返回信息大概就是这样子的:

已使用在线格式化工具格式化

{
"code": 0,
"data": {
"ip": "210.75.225.254",
"country": "中国",
"area": "华北",
"region": "北京市",
"city": "北京市",
"county": "",
"isp": "电信",
"country_id": "86",
"area_id": "100000",
"region_id": "110000",
"city_id": "110000",
"county_id": "-1",
"isp_id": "100017"
}
}


首先处理请求接口

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface RetrofitService {

@FormUrlEncoded
@POST("service/getIpInfo.php")
Call<IPItem> queryIP(@Field("ip") String ip);

}


创建返回数据对象

然后根据返回信息造个类,内容是code和data。然后再为data造个类。类里面大概city, region, isp之类的,后面是字符串就把类型改成字符串。不用全部都弄上,我们并不是需要所有的信息。最后alt+insert为它们添加get方法。

IPItem.java

public class IPItem {
private int code;//status code
private IPData data;

public IPData getData() {
return data;
}

public int getCode() {
return code;
}
}


IPData.java

public class IPData {
private String region;//province
private String city;
private String country;
private String isp;//Internet Service Provider
private String country_id;

public String getCountry() {
return country;
}

public String getCountry_id() {
return country_id;
}

public String getRegion() {
return region;
}

public String getCity() {
return city;
}

public String getIsp() {
return isp;
}

public String toString() {
return isp;
}
}


在OnClickListener里,首先

Retrofit retrofitIP = new Retrofit.Builder()
.baseUrl("http://ip.taobao.com/")                       .addConverterFactory(GsonConverterFactory.create())
.build();


然后绑定Service

RetrofitService queryService = retrofitIP.create(RetrofitService.class);
//RetrofitService.class是适配接口的类名。


然后通过Call发起请求:

Call<IPItem> call = queryService.queryIP(ip);
call.enqueue(new Callback<IPItem>() {……}


然后直接自动补全出 onResponse && onFailure 方法

在Response里直接调用body()方法就可以将内容填充到类里了。

IPItem ipItem = response.body();


下面是草民实现的一个版本:

btnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String ip = editIP.getText().toString();
Retrofit retrofitIP = new Retrofit.Builder().baseUrl("http://ip.taobao.com/")
.addConverterFactory(GsonConverterFactory.create()).build();

if (ip.isEmpty())
Log.e(TAG, "IP is Empty");
else Log.i(TAG, ip);

RetrofitService queryService = retrofitIP.create(RetrofitService.class);
Call<IPItem> call = queryService.queryIP(ip);
call.enqueue(new Callback<IPItem>() {
@Override
public void onResponse(Call<IPItem> call, Response<IPItem> response) {
IPItem ipItem = response.body();
StringBuilder result = new StringBuilder();
if (0 == ipItem.getCode()) {
IPData data = ipItem.getData();
if (!data.getCountry_id().equals("IANA")) {
result.append("IP:");
result.append(ip);
result.append("\n");
result.append("Location:");
result.append(data.getCountry());
result.append(data.getRegion());
result.append(data.getCity());
result.append(" ");
result.append(data.getIsp());
tvInfo.setText(result);
} else tvInfo.setText("未分配或者内网IP");
}
}

@Override
public void onFailure(Call<IPItem> call, Throwable t) {
Log.e(TAG, "QUERY FAILURE");
}
});
}
});


写在后面



到此,基本的使用就这样结束了。希望大家同时去阅读一下官方的API文档,获取更广泛的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android api java