我们一起先来了解Retrofit吧,Retrofit是Square开 发的一个Android和Java的REST客户端库。
这个库非常简单并且具有很多特性,相比其他的网络库,更容易让初学者快速掌握。
它可以处理GET、 POST、PUT、DELETE…等请求,还可以使用picasso加载图片。
再来看看目标架构如下图
别纠结了,开始编码吧!!!
编码之前大家可以看看Retrofit官网。
1. 设置
1)权限:首先确保在AndroidManifest.xml中请求了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2. 导包
1)Eclipse:下载jar包
2)Android Studio:通过配置gradle配置将Retrofit框架引入项目。也可以可以直接 File->Project Structure->Dependencies->Library dependency 搜索Retrofit即可,添加以下版本的就可以咯。
compile 'com.squareup.retrofit:retrofit:2.0.2-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.2-beta2
上面那个包已经是目前最新的,不建议直接使用不要偷懒还是去github官网看看吧。
3.Retrofit怎么用
1)虽然Retrofit官网已经说明了,我还是要按照我的思路说一下。
比如你要请求这么一个API:
http://apicloud.mob.com/v1/mobile/address/query?key=123456&phone=133****982
这是一个查询手机号码归属地的请求示例。
2)查看gitHub上某个repo的contributors,首先你要这样创建一个接口:
public interface GitHubClient {
@GET("mobile/address/query?")
Call<Gitmodel> searchPhone(
@Query("key") String key,
@Query("phone") String phone);
}
3)然后你还需要创建一个Retrofit对象:
//API接口的地址
private String API_URL= "http://apicloud.mob.com/";
//创建一个非常简单的适配器点GitHub的API
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
4)再用这个Retrofit对象创建一个GitHub对象:
//GitHub的API接口创建一个实例
GitHubClient api = retrofit.create(GitHubClient.class);
//创建一个调用实例的查找Retrofit call
Call<Gitmodel> call = api.searchPhone("123456", phoneNumber);
5)最后你就可以用这个Githb对象获得数据了:
//获取并打印库的call列表
call.enqueue(new Callback<Gitmodel>() {
@Override
public void onResponse(Call<Gitmodel> call, Response<Gitmodel> response) {
Gitmodel gitmodel = response.body();
if (gitmodel != null) {
resultLayout.setVisibility(View.VISIBLE);
city.setText("城市:" + gitmodel.getResult().getCity());
cityCodeText.setText("归属地:" + gitmodel.getResult().getCityCode());
operatorText.setText("运营商:" + gitmodel.getResult().getOperator());
mobileNumberText.setText("手机号:"+ gitmodel.getResult().getMobileNumber());
provinceText.setText("省份:"+ gitmodel.getResult().getProvince());
zipCodeText.setText("邮政编码:"+ gitmodel.getResult().getZipCode());
}
}
@Override
public void onFailure(Call<Gitmodel> call, Throwable t) {
}
});
就这么简单,上述代码已经实现通过retrofit访问restful api获取数据并显示。
4.最后
Retrofit非常巧妙的用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求
Retrofit的功能非常多的依赖Java反射,代码中其实还有很多细节,比如异常的捕获、抛出和处理,大量的Factory设计模式(为什么要这么多使用Factory模式?)
Retrofit中接口设计的恰到好处,在你创建Retrofit对象时,让你有更多更灵活的方式去处理你的需求,比如使用不同的Converter、使用不同的CallAdapter,这也就提供了你使用RxJava来调用Retrofit的可能
我也慢慢看了Picasso和Retrofit的代码了,收获还是很多的,也更加深入的理解面向接口的编程方法,这个写代码就是好的代码就是依赖接口而不是实现最好的例子
好感谢开源的世界,让我能读到大牛的代码。我一直觉得一个人如果没有读过好的代码是不太可能写出好代码的。什么是好的代码?像Picasso和Retrofit这样的就是好的代码,扩展性强、低耦合、插件化
5.相关
如果你感觉还没有太明白可以看一看一下视频:
视频
6.总结
Retrofit使用的最核心的两个技术:动态代理和反射。
其实Retrofit无非就是让用户创建接口,使用自己指定的规则进行网络访问,把接口传入Retrofit,接口上附着的规则由Retrofit进行层层解析后,再进行实际的网络调用。Retrofit所做的事情就是帮助用户简化了大量的网络访问代码,用户只需写少量代码就能得到想要的结果。如果你懂OO设计,了解一定的设计模式且熟悉JAVA的API,那么你完全可以自己写一个类似Retrofit一样的网络框架!