创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUl("http://localhost:........../")
.build();
创建Retrofit实例时需要通过 Retrofit.Builder ,并调用 baseUrl方法设置URL
注1: :Retrofit2的baseUrl 必须通过 /(斜线)结束,不然会抛一个IllegalArguemntException
注2::上面的 注1 应该描述为 baseUrl中的路径(path)必须以/结束,因为有些特殊情况可以不以 / 结尾,比如,其实这个URL https://www.baidu.com?key=value 用来作为baseUrl其实是可行的,因为这个URL隐含的路径就是 ** / (斜线),代表根目录,而后面的?key=value 在拼接请求时会被丢掉所以写上也没用。
接口定义
以获取指定id的Blog为例:
public interface BlogService{
@GET("blog/{id}")
call<ResponseBody> getBlog(@Path("id" int id):
}
我们还需要Retrofit创建一个BlogService 的代理对象
BlogService service = retrofit.create(BlogService.class);
拿到代理对象后,就可以调用此方法了;
接口调用
Call<ResponseBody> call = service.getBlog(2);
//用法和okhttp的call 如出一辙
//不同的是 如果是Android系统,回调方法执行在主线程
call.enqueue(new Callback<ResponseBody>(){
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
}
Retrofit注解详解
Retrofit 共有22个注解,我们将22个注解分为三类,并用表格的形式展现出来
第一类:HTTP请求方法
以上的表格中,除了HTTP 以外都对应了HTTP标准的请求方法,而HTTP注解则可以代替以上方法中的任意一个注解,有三个属性:method、path、hasBody,下面是用HTTP注解实现上面的例子:
public interface BlogService{
//method 表示请求的方法,区分大小写
//path 表示路径
//hasBody 表示是否有请求体
@HTTP(method= "GET" , path = "blog/{id}", hasBody = false)
Call<ResponseBody> getBlog(@Path("id") int id);
}`
注::method的值 retrofit不会做处理,所以要自行保证其准确性,之前使用小写也是可以的
第二类:标记类
第三类:参数类
注1::{占位符} 和 PATH 尽量只用在URL的path部分,url中的参数使用 Query 和 QueryMap 代替,保证接口定义的简洁
注2: Query、Field 和 Part 这三者都支持数组 和实现了Iterable 接口的类型,如List,Set 等,方便向后台传递数组
Call<ResponseBody> foo(@Query("ids[]") List<Integer> ids);
//结果:ids[]=0&ids[]=1&ids[]=2
Gson 与 Converter
在默认情况下,Retrofit只支持HTTP的响应体转换为ResponseBody
这也就是为什么前面的例子接口的返回值是 Call
但如果响应体只支持转换为 ResponseBody 的话何必引入泛型呢
Converter 是 Retrofit 为我们提供的用于将ResponseBody 转换为我们想要的类型,有了Converter之后我们就可以把我们的第一个例子接口写成这个样子了:
public interface BlogServer{
@GET("blog/{id}")
Call(Result<Blog>> getBlog(@Path("id") int id);
}
//之前的是:
public interface BlogService{
@GET("blog/{id}")
Call<ResponseBody> getBlog(@Path("id" int id):
}
当然只改变泛型的类型是不行的,我们在创建Retrofit时需要明确告知用于将ResponseBody 转换成我们泛型中的类型时需要使用的Converter
引入Gson支持:
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
通过GsonConverterFactory为Retrofit添加Gson支持:
Gson gson = new GsonBuilder()
// 配置你的Gson
.setDateFormat("yyyy-MM-dd hh:mm:ss")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:2342/")
//可以接受自定义的Gson,当然也可以不传
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
这样 Retrofit就会使用Gson将ResponseBody 转换成我们想要的类型。
接下来演示下如何如何创建一个Blog
@POST("blog")
Call(Result<Blog>> createBlog(@Body Blog blog);
被*@Body* 注解的Blog将会被Gson转换成RequestBody发送到服务器
BlogService service = retrofit.create(BlogService.class);
Blog blog = new Blog();
blog.content = "";
blog.ttile = "";
blog.author = "";
Call<Result<Blog>> call = service.createBlog(blog);
RxJava 与 CallAdapter
上面介绍了 Converter 是对于 Call 中 T的转换,而 CallAdapter 则可以对 Call转换,这样的话,Call<T 中的Call 也是可以被 替换的,而返回的类型就决定你后续的处理程序逻辑,同样 Retrofit提供了多个CallAdapter,这里以 RxJava 的为例,用Observable 代替 Call
参考:https://www.jianshu.com/p/308f3c54abdd
这篇文章不错:https://blog.csdn.net/lmj623565791/article/details/51304204