Retrofit2介绍

本文详细介绍Retrofit2网络请求库的基本使用方法,包括如何基于RESTful风格的API进行封装,以及各种注解如@GET、@POST等的使用方式。同时介绍了如何集成RxJava和Gson等工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Retrofit2介绍

RESTful

在开始了解 Retrofit 的使用之前,我们需要理解RESTful概念因为 Retrofit 的初衷就是根据 RESTful风格的API 来进行封装的。关于RESTful 我们可以参考
《RESTful API 设计指南》

Retrofit

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了。官方介绍:http://square.github.io/retrofit/

引用

  • Gradle:
compile 'com.squareup.retrofit2:retrofit:2.1.0'

使用

学习一门新的技术的时候,我们首先要参考的就是官方文档,我们看看官方文档是怎么写的:http://square.github.io/retrofit/

大家看到官方文档,很是简单粗暴,一言不合就上代码

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

从上面代码我们可知,Retrofit将HTTP API转换为interface接口的方式(Retrofit turns your HTTP API into a Java interface.)

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

Retrofit 根据之前定义的接口生成一个具体的实现。通俗的讲就是我们可以将Retrofit类看作是一个“工厂类”的角色,我们在接口中提供了此次的“产品”的生产规格信息,而Retrofit则通过信息负责为我们生产。

Call<List<Repo>> repos = service.listRepos("octocat");

“Call”:通过之前封装的请求接口对象创建的任一的Call都可以发起一个同步(或异步)的HTTP请求到远程服务器。

以上信息就是简单的Retrofit的操作,通过这个实例感受最多的就是解耦明确;使用简单。通过注解的方式描述request让人眼前一亮。

其他注解

  • @Path
public interface IDemoBiz
{
 @GET("modify/{userId}")
 Call<User> modify(@Path("userId") String userId);
}
  • @Query
    对于@GET来说,参数信息是可以直接放在url中上传的。那么你马上就反应过来了,这一样也存在严重的耦合!于是,就有了 @Query
public interface IDemoBiz
{
 @GET("modify/{userId}")
 Call<User> modify(@Path("userId") String userId,@Query("name") String name);
}
  • @QueryMap
    假设我要在参数中上传10个参数呢?
public interface IDemoBiz
{
 @GET("modify/{userId}")
 Call<User> modify(@Path("userId") String userId,@QueryMap Map<String,String> params);
}
  • @Post @Body Post请求上传body
public interface IDemoBiz
{
 @POST("add")
 Call<List<User>> get(@Body User user);
}
  • @Post @FormUrlEncoded 表单上传

服务器通过request.getParameter的方式直接读取参数信息

public interface IDemoBiz
{
  @POST("modify/{userId}")
 Call<User> modify(@Path("userId") String userId,@Field("name") String name,@Field("nickname") String nickname);
}
  • @Headers与@Header

可以设置HTTP的header,拿使用编码来举例

public interface IDemoBiz
{
  @Headers("Content-type:application/x-www-form-urlencoded;charset=UTF-8")
  @FormUrlEncoded
  @POST("modify/{userId}")
 Call<User> modify(@Path("userId") String userId,@Field("name") String name,@Field("nickname") String nickname);
}

上面代码说的使用@Headers的用法,那么@Header怎么使用呢?@Header与@Headers不同在于是动态的添加请求头信息。

 @FormUrlEncoded
  @POST("modify/{userId}")
 Call<User> modify(@Header("Content-type" String contentType),@Path("userId") String userId,@Field("name") String name,@Field("nickname") String nickname);

HTTP的Header也可以在okhttp的拦截器中添加。

  • 其他

当然我们还可以进行文件上传和下载,这里就不过多介绍了,网上有很多示例。

注意事项

特别注意如果需要继承rxjava和gson转换,则还需要引入

   compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
   compile 'com.squareup.retrofit2:converter-gson:2.1.0'

其他格式转换引入

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
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

如果不添加转换器会报IllegalArgumentException异常,这也会是新手开发碰到的第一个坑

另外打个广告,我本人参考其他大神搭的一个Retrofit2.0+okhttp3+Rxjava的框架,还望多多支持,https://github.com/CentMeng/baseFramework

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值