Android学习之网络请求库Retrofit2

网络请求库有很多种,例如使用HttpUrlConnection,使用HttpClient,或者使用Volley,使用OKHttp,而现在的主流是使用OKHttp + Retrofit,往细了讲本人也不是很清楚其中的区别,今天也不讲它们的区别。Retrofit是一个十分强大的优秀的网络请求库,只要熟悉了以后,使用起来也是十分方便的。
Retrofit地址:https://github.com/square/retrofit
Retrofit帮助文档地址:http://square.github.io/retrofit/
大家可以从这个地址compile这个库,先看下使用Retrofit所需要的库,需要使用到OKHttp,因为Retrofit依赖于它,然后因为要获取JSON数据,所以要解析JSON,所以使用Gson:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.6.2'
我们首先肯定需要一个API地址来测试,这里使用百度APIStore的手机归属地查询服务来测试
地址:http://apistore.baidu.com/apiworks/servicedetail/794.html
接口地址:http://apis.baidu.com/apistore/mobilenumber/mobilenumber
首先要获取Api Key,接下来调用时要使用。APIStore中一个用户只有一个Api Key,可以调用平台所有即用服务。怎么申请这里不讲了。
这个接口的API主机地址为:http://apis.baidu.com,资源地址为:/apistore/mobilenumber/mobilenumber,我们需要一个key等于apikey的Header和一个key等于phone的查询关键字,该请求为GET请求。所以我们需要构造一个GET请求,添加一个Header,添加一个Query关键字,访问该API返回的数据格式如下:
{
    "errNum": 0,
    "retMsg": "success",
    "retData": {
        "phone": "XXXXXXXXXXX",
        "prefix": "XXXXXXX",
        "supplier": "移动",
        "province": "上海",
        "city": "上海",
        "suit": "136卡"
    }
}
这里我的手机号码用X来代替了,实际得到的是自己输入的号码,然后是创建数据对象,相信使用过Gson库都知道为什么要这么做。数据对象可以帮助我们更好的处理数据:
/**
 * PhoneResult
 *
 * @author yuzhentao
 */
public class PhoneResult {

    private int errNum;
    private String retMsg;
    private RetDataEntity retData;

    public int getErrNum() {
        return errNum;
    }

    public void setErrNum(int errNum) {
        this.errNum = errNum;
    }

    public String getRetMsg() {
        return retMsg;
    }

    public void setRetMsg(String retMsg) {
        this.retMsg = retMsg;
    }

    public RetDataEntity getRetData() {
        return retData;
    }

    public void setRetData(RetDataEntity retData) {
        this.retData = retData;
    }

    public static class RetDataEntity {

        private String phone;
        private String prefix;
        private String supplier;
        private String province;
        private String city;
        private String suit;

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }

        public String getPrefix() {
            return prefix;
        }

        public void setPrefix(String prefix) {
            this.prefix = prefix;
        }

        public String getSupplier() {
            return supplier;
        }

        public void setSupplier(String supplier) {
            this.supplier = supplier;
        }

        public String getProvince() {
            return province;
        }

        public void setProvince(String province) {
            this.province = province;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getSuit() {
            return suit;
        }

        public void setSuit(String suit) {
            this.suit = suit;
        }

    }

}
然后根据官方文档的说明创建接口:
/**
 * PhoneService
 *
 * @author yuzhentao
 */
public interface PhoneService {

    @GET("/apistore/mobilenumber/mobilenumber")
    Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);

}
GET方式就是用@GET,@GET里面填写的就是资源地址,方法的参数就是我们需要传入的Value。根据API文档来@Header或者@query。
其中@Header用来添加Header,@Query用来添加查询关键字

构建好接口之后,分4步来走:

1.创建Retrofit对象
2.创建访问API的请求
3.发送请求
4.处理结果

/**
 * 主界面
 *
 * @author yuzhentao
 */
public class MainActivity extends Activity {

    private static final String BASE_URL = "http://apis.baidu.com";
    private static final String API_KEY = "";//这里输入Api Key

    private Context context;

    private EditText et;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        context = this;
        et = (EditText) findViewById(R.id.edittext_activity_main);
        findViewById(R.id.button_activity_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                query();
            }
        });
    }

    /**
     * 查询
     */
    private void query() {
        Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(BASE_URL).build();
        PhoneService phoneService = retrofit.create(PhoneService.class);
        Call<PhoneResult> phoneResultCall = phoneService.getResult(API_KEY, et.getText().toString());
        phoneResultCall.enqueue(new Callback<PhoneResult>() {
            @Override
            public void onResponse(Call<PhoneResult> call, Response<PhoneResult> response) {
                if (response.isSuccessful()) {
                    Log.e("yuzhentao", "获取成功");
                    PhoneResult phoneResult = response.body();
                    if (phoneResult != null) {
                        PhoneResult.RetDataEntity retDataEntity = phoneResult.getRetData();
                        Toast.makeText(context, retDataEntity.getCity(), Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onFailure(Call<PhoneResult> call, Throwable t) {
                Log.e("yuzhentao", "获取失败");
            }
        });
    }

}
关于GsonConverterFactory.create()是什么呢?

这是用来转换服务器数据到对象使用的。该Demo中使用API返回的数据是JSON格式,所以使用Gson来转换,如果服务器返回的是其他类型的数据,则根据需要编写对应的解析方法。

或许Retrofit一开始使用起来比较麻烦,但是只要我们会使用了,以后就是一帆风顺,相信以后的工作中大家都会使用到的,希望对大家有点帮助。

效果图:


Demo地址:http://download.csdn.net/detail/qq_23940659/9470427

最后感谢:http://www.devwiki.net/2016/03/02/Retrofit-Use-Course-1/

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值