Retrofit2 的使用

创建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注解则可以代替以上方法中的任意一个注解,有三个属性:methodpathhasBody,下面是用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中的参数使用 QueryQueryMap 代替,保证接口定义的简洁
注2: QueryFieldPart 这三者都支持数组 和实现了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值