Retrofit2 简明教程一.docx
《Retrofit2 简明教程一.docx》由会员分享,可在线阅读,更多相关《Retrofit2 简明教程一.docx(12页珍藏版)》请在冰豆网上搜索。
![Retrofit2 简明教程一.docx](https://file1.bdocx.com/fileroot1/2023-1/10/2dab079e-c1a2-4ee6-bcdf-5417ef7ebba5/2dab079e-c1a2-4ee6-bcdf-5417ef7ebba51.gif)
Retrofit2简明教程一
Retrofit2简明教程
(一)
简介
Retrofit是一个Square开发的类型安全的REST安卓客户端请求库。
这个库为网络认证、API请求以及用OkHttp发送网络请求提供了强大的框架。
Retrofit可以利用接口,方法和注解参数来声明式定义一个请求应该如何被创建。
并且可更换或自定义HTTPclient,以及可更换或自定义Converter,返回数据解析方式。
Retrofit可用于Android和Java的一个类型安全(type-safe)的REST客户端,如果你的服务器使用的使RESTAPI,那么你将非常适合使用它。
安装
请选择以下三种方式中一种进行安装,最后如果你正在使用PROGUARD,请添加下方PROGUARD配置。
SOURCE
关于Retrofit源代码以及官方简单例子,请访问
GRADLE(推荐)
如果你正在使用GRADLE在你的项目中的build.gradle添加以下代码到您的配置:
compile'com.squareup.retrofit2:
retrofit:
2.1.0'
MAVEN
如果你正在使用MAVEN在你的项目中的pom.xml添加以下代码到您的配置:
com.squareup.retrofit2
retrofit
2.1.0
PROGUARD
如果你正在使用PROGUARD在你的项目中添加以下代码到您的配置:
-dontwarnretrofit2.**
-keepclassretrofit2.**{*;}
-keepattributesSignature
-keepattributesExceptions
最初的步骤
创建Retrofit实例
在使用Retrofit前,我们需要先创建Retrofit实例,并且做一系列配置,然而Retrofit设计的也是非常好,这些配置都是可插拔的:
Retrofitretrofit=newRetrofit.Builder()
//设置baseUrl,注意baseUrl应该以/结尾。
.baseUrl("http:
//news-
//使用Gson解析器,可以替换其他的解析器
.addConverterFactory(GsonConverterFactory.create())
//设置OKHttpClient,如果不设置会提供一个默认的
.client(newOkHttpClient())
//.client(newUrlConnectionClient())
//.client(newApacheClient())
//.client(newCustomClient())
.build();
更换HTTPclient与Converter
Retrofit背后的HTTPclient,以及序列化机制(JSON/XML协议)等都是可以替换,因此你可以选择自己合适的方案。
Retrofit最早出来的时候,只支持Apache的HTTPclient。
后来增加了URLconnection,以及OkHttp的支持。
如果你想使用其他的HTTPclient,可以通过以下方式了替换,或者更改为自定义的HTTPclient:
//设置OKHttpClient,如果不设置会提供一个默认的OkHttpClient
.client(newOkHttpClient())
//.client(newUrlConnectionClient())
//.client(newApacheClient())
//.client(newCustomClient())
序列化功能也是可替换的。
默认是用的GSON,你当然也可以用Jackson来替换掉。
//使用Gson解析器,可以替换其他的解析器
.addConverterFactory(GsonConverterFactory.create())
//当需要返回原始String数据时
.addConverterFactory(ScalarsConverterFactory.create())
除此之外Retrofit还提供以下几种Converter:
Gson:
com.squareup.retrofit2:
converter-gson
Jackson:
com.squareup.retrofit2:
converter-jackson
Moshi:
com.squareup.retrofit2:
converter-moshi
Protobuf:
com.squareup.retrofit2:
converter-protobuf
Wire:
com.squareup.retrofit2:
converter-wire
SimpleXML:
com.squareup.retrofit2:
converter-simplexml
Scalars(primitives,boxed,andString):
com.squareup.retrofit2:
converter-scalars
基本使用
我们将看一下如何用Retrofit与服务器交互,通过它你将学会如何运用Retrofit于日常开发。
Retrofit使用接口,方法和参数,使用注解表明了请求将如何处理,每一种方法都必须有一个HTTP标注提供请求的方法和相对URL,有五种内置注解:
GET,POST,PUT,DELETE,和HEAD,在注解中指定URL。
请选择以下方式中合适的请求方式来处理您的请求。
GET
在这里我们最开始第一个GET请求使用的是知乎日报的api,为了更好使用Retrofit其他请求方式而又没有比较好的公开api,我自行编写了配合使用Retrofit的测试服务端,放置在外网以便大家测试使用。
普通GET
基于上面的最初的步骤,接下来我们需要定义一个接口,并且使用注解(@GET)表明一次GET请求:
publicinterfaceZhihuService{
//获取启动页大图
@GET("start-image/1080*1776")
CallgetStartImage();
}
这是一个普通的GET请求,接着我们来看如何利用Retrofit创建服务接口,并且设置参数:
ZhihuServicemessageService=retrofit.create(ZhihuService.class);
CallstartImage=messageService.getStartImage();
最后,使用startImage.enqueue进行异步请求,并且获取了我们期待的数据(实体对象):
startImage.enqueue(newCallback(){
@Override
publicvoidonResponse(Callcall,Responseresponse){
if(response.isSuccessful()){
Log.d(TAG,response.body().toString());
resultTextView.setText(""+response.body().toString());
}
}
@Override
publicvoidonFailure(Callcall,Throwablet){
resultTextView.setText(""+"error:
"+t.getMessage());
}
});
如果你想使用call.execute()进行同步请求,需要注意的是不要放在UI线程:
try{
Responseresponse=call.execute();//同步
Log.d(TAG,"response:
"+response.body().toString());
}catch(IOExceptione){
e.printStackTrace();
}
因为一次call.execute()的request只能执行一次,否则你将会得到如下错误:
java.lang.IllegalStateException:
Alreadyexecuted
如果你想取消本次请求可以使用startImage.cancel()或者是复制一次request,再次请求:
startImage.cancel();//取消
CallcloneRequsest=startImage.clone();//复制
是不是感觉特别简单,使用时候只需调用接口,这一切都简化了我们的操作。
动态参数(GET)
我们需要先定义一个接口,并且使用注解(@Query)或者是@QueryMap表明动态参数请求如何处理:
相应的URL是这样:
http:
//baseurl/app/test/sayHello?
username=fuchenxuan&age=110
@GET("test/sayHello")
CallsayHello(@Query("username")Stringusername,@Query("age")Stringage);
接着我们忽略接口的创建,直接使用Retrofit与服务器交互,值得注意的是我们此次返回的数据是String,而不是一个自定义的实体类对象。
所以我们需要更换Converter,否则你将会遇到不必要的麻烦(而我觉得Retrofit应该提供一个默认Stirng的实现):
//当需要返回原始String数据时
.addConverterFactory(ScalarsConverterFactory.create())
接着我们就得到了我们期待的数据:
CalldoubanCall=myTestApiService.sayHello("fuchenxuan","110");
doubanCall.enqueue(newCallback(){
@Override
publicvoidonResponse(Callcall,Responseresponse){
if(response.isSuccessful()){
Log.d(TAG,response.body().toString());
resultTextView.setText(""+response.body().toString());
}
}
@Override
publicvoidonFailure(Callcall,Throwablet){
}
});
RESTful方式(动态PATH)
GET动态PATH就是优雅的RESTfulapi方式,
相应的URL是这样:
http:
//news-
@GET("start-image/{size}")
CallgetStartImageByPath(@Path("size")Stringsize);
POST
form-data(表单数据)
form-data就是如表单K-V参数形式
这里其实就跟GET的动态参数是一致的只是替换了@POST注解
publicinterfaceMyTestApiService{
@POST("test/sayHello")
CallpostSayHello(@Query("username")Stringusername,@Query("age")Stringage);
}
JSON参数(raw)
当服务器需要你POST参数以json打包数据格式请求时,然而这种参数方式RESTfulapi也是非常常见的,我们需要使用@Body注解:
@POST("test/sayHi")
//@Headers("Accept-Encoding:
application/json")
//使用@Headers可添加header
CallpostSayHi(@BodyUserBeanuserBean);
上面我们还示例了如何使用@Headers@Headers("Accept-Encoding:
application/json")添加头部信息,或者我们有需求需要使用@Header实现动态头部信息:
@POST("test/sayHi")
@Headers("Accept-Encoding:
application/json")
//也可以使用@Header可添加header
CallpostSayHi(@BodyUserBeanuserBean,@Header("city")Stringcity);
RESTful方式(动态PATH)
前面也说了retrofit非常适用于RESTfulurl的格式,这里因为知乎的就是RESTfulapi,我们直接使用和GET动态URL一样的注解(@PATH)来表明请求处理:
相应的URL是这样:
http:
//news-
@POST("start-image/{size}")
CallgetStartImageByPath(@Path("size")Stringsize);
文件上传
在我们开发当中肯定必不可少图片上传了,我们使用表单上传文件时,必须让