使用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.1Windows 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文档,获取更广泛的使用。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试