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

来源:互联网 发布:怎么查看淘宝信用等级 编辑:程序博客网 时间:2024/05/17 02:32

概述

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文档,获取更广泛的使用。

0 0
原创粉丝点击