1、Retrofit是什么?
Retrofit是与web服务器提供的API接口(URL)进行通信的库。
2、Retrofit、Volley、OkHttp等的关系
1、volley是一个简单的异步Http的库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。
2、android_async_http:与volley不一样的是异步网络库。但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,因为这个库已经不适合android平台了。
3、okhttp:是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确。反例就是URL,自己做得文件缓存,而且不遵守http缓存机制。
4、retrofit与picasso一样都是在okhttp基础之上做的封装。项目中直接就可用了。
*但是还有一个常识性的错误:volley、retrofit、android_async_http帮你封装了具体的请求,线程切换以及数据转换。而OkHttp是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向于真正的请求,跟HttpClient、HttpUrlConnection的职责是一样的。
3、Retrofit的示例
添加依赖和权限
在build.gradle文件中添加依赖,在Mainfest.xml文件中添加所需的网络权限
compile 'com.squareup.retrofit:retrofit:2.0.1-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
先通过一个简单的demo,整体认识一下Retrofit是怎么工作的。
示例需要访问的URL:https://api.github.com/users/jantxue
1、根据URL来构造一个java接口,接口名称可自定义
public interface APIInterface {
@GET("/users/{user}")
Call<TestModel> repo(@Path("user") String user);
这个接口负责URL中hostname和port后的部分
hostname和port会在构造Retrofit对象时,添加一个baseUrl(https://api.github.com)。在此GET的意思是,发送一个GET请求,请求地址为:baseUrl+"/users/{user}"。{user}类似于占位符的作用,具体类型由repo(@Path("user")String user)指定,这里表示{user}将是一段字符串。
定义Model
请求会将JSON数据转化为java实体类,所以我们需要自定义一个Model
public class TestModel {
private String login;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}
进行连接通信
现在我们有了要链接的Http接口和要返回的数据结构,就可以执行请求了:
首先
,要先构造一个Retrofit
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
注意:这里添加的baseUrl和GsonConverter,前者表示要访问的网站是,后者是添加了一个转换器。
接着
,创建我们的API接口对象,这里ApiInterface是我们创建的接口:
APIInterface service = retrofit.create(APIInterface.class);
使用ApiInterface创建一个请求对象:
Call<TestModel> model = service.repo("Guolei1130");
注意这里的 .repo("Guolei1130") 取代了前面的 {user}。到这里,我们要访问的地址就成了:
可以看出这样的方式有利于我们使用不同的参数访问一个web API接口,比如你可以随意改成.repo("zhangsan");
最后
,就可以发送请求了:
model.enqueue(new Callback<TestModel>() {
@Override
public void onResponse(Call<TestModel> call, Response<TestModel> response) {
// Log.e("Test", response.body().getLogin());
System.out.print(response.body().getLogin());
}
@Override
public void onFailure(Call<TestModel> call, Throwable t) {
System.out.print(t.getMessage());
}
});
至此,我们就利用Retrofit完成了一次网络请求。
未完待续。。。。。。