几个月前,对Retrofit进行了一个系统的学习,不过没有做一个整理和总结,正好国庆没什么事就写几篇博客对Retrofit的简单使用,上传下载进度监听,封装使用,源码解析做一个学习,记录如下
1~简单使用
由于retrofit2.0与先前版本的差别还是比较大,对于不同版本之间的差异在这里就不在进行详细区别。下面的例子也是针对于retrofit2.0进行介绍的。retrofit2.0它依赖于OkHttp,而且这部分也不再支持替换。在这里我们也不需要显示的导入okHttp,在retrofit中已经导入okhttp3。
添加依赖
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
创建Api接口
public interface ApiService {
//GET为GET请求,标明请求地址为BASEURI+/users/{user}
//{user}会被getFeed方法的参数代替
//JsonBean为自己设置返回类型,通过.addConverterFactory(GsonConverterFactory.create())
//利用gson自动完成数据转换
@GET("users/{user}")
Call<JsonBean> getFeed(@Path("user")String user);
}
将http api转换为java接口,指定请求方式,和确定返回值类型
创建Retrofit实例
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://api.github.com/")// '/'尽量放在baseUri的后面而不是放在注解中url的前面
//添加转换器完成数据转换,将Json类型的数据转换为JavaBean
.addConverterFactory(GsonConverterFactory.create())
.build();
调用Api接口
在调用API接口请求后,获得一个json字符串,通过Gson进行解析成一个JsonBean
//得到ApiService
ApiService service=retrofit.create(ApiService.class);
Call<JsonBean> call = service.getFeed("Guolei1130");
call.enqueue(new Callback<JsonBean>() {
@Override
public void onResponse(Response<JsonBean> response, Retrofit retrofit) {
JsonBean jsonBean=response.body();
Log.e(TAG, "onResponse: "+jsonBean.toString());
}
@Override
public void onFailure(Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage());
}
});
2~Retrofit注解详解
请求方式
GET,POST,HEAD,PUT等等,其实常用的就GET和POST
路径拼接
①Path
Call<JsonBean> getFeed(@Path("user")String user);
②Query-一个键值对
Call<JsonBean> onekey(@Query("wd") String wdvalue);
③QueryMap-多个键值对
Call<JsonBean> manykey(@QueryMap Map<string, string> options);
对于下面这张拼接
Call<JsonBean> test(@Path("user")String user,@Query("name")String name,@QueryMap Map<String,String> options);
HashMap<String,String> map=new HashMap<String,String>();
map.put("age",1);
map.put("password","123");
Call<JsonBean> feed = service.getFeed("xx","liujian",map);
最终拼接成的url为BaseUri+"group/xx?name=liujian&&age=1&&password=123"
④请求体
我们知道post和get的区别当中有一点就是参数的位置,get放在url路径当中,post放在请求体当中。
注意:请求体对象会转换成json格式数据提交,服务器端需要进行json解析
@POST("users/new.jsp")
Call<User> createUser(@Body User user);
⑤表单FormUrlEncoded
使用表单格式进行post提交,每个键值对都要被含有名字的@Field注解和提供值的对象所标注
@FormUrlEncoded
@POST("/index.php")
Call<User> updateUser(@Field("first_name") @Body User user, @Field("last_name") String last);
我们还可以使用下面的简单方式
//@FieldMap注解和Map对象参数来指定每个表单项的Key,value的值:
@FormUrlEncoded
@POST("user/index.php")
Call<User> updateUser(@FieldMap Map<String,String> fieldMap);
⑥表单Multipart
通过@Multipart注解来发送Multipart数据。通过@Part注解来定义需要发送的文件。
@Multipart
@POST("/fileabout.php")
Call<String> upload(@Part("fileName") String des,
@Part("file\"; filename=\"1.txt") RequestBody file);
⑧Header处理
以使用@Headers注解给函数设置静态的header
@Headers("Cache-Control: max-age=640000")
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
⑨Url
Retrofit2.0中提出一个新的注解@Url,允许我们直接传入请求的URL
@GET
Call<List<Contributor>> repoContributorsPaginate(@Url String url);
3~同步和取消任务
同步
Response<JsonBean> response=call.excute()
JsonBean jsonBean=response.body();
取消正在执行的任务
call.cancel()
4~Retrofit与RxJava
<span style="font-size:14px;">@GET("users/{user}")
Observable<JsonBean> getFeed(@Path("user")String user);
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api.github.com/")
.build();
ApiService service=retrofit.create(ApiService.class);
service.getFeed("Guolei1130")
.observeOn(AndroidSchedulers.mainThread())//让订阅的操作发送在主线程中
.subscribe(new Observer<JsonBean>() {
@Override
public void onNext(JsonBean user) {
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
// Error handling
...
}
}); </span>
对于RxJava不熟悉的可以去看一下我前面的博客,RxJava的优点我就不多说了,也就链式调用,使的代码逻辑更加清晰,增加代码的可读性,另外通过一系列的操作符完成对发出的消息进行一系列变化操作