Android - Retorfit 2 使用详解

本文详细介绍了 Retrofit 2.3.0 的基本概念、优势以及如何使用。Retrofit 是 Square 公司的网络加载框架,基于 OkHttp,使用注解配置网络请求。内容包括网络请求方法、标志和参数的注解,以及使用步骤:添加依赖、创建数据接收类、定义网络请求接口、构建 Retrofit 实例、发送请求和处理响应。文中提供两个实例,分别演示 GET 和 POST 请求的操作流程。
摘要由CSDN通过智能技术生成

本文中使用 Retrofit 2.3.0 版本

侧重于如何使用,至于原理暂不考虑。

面临秋招的准大四狗,看了看各大公司的面经,什么 Retrofit、RxJava,还有一众图片加载库 比如 Glide、Picasso 等等都快成了标配了,动辄分析其源码。原来一直以自己入门尚短为由拖沓没去了解这些开源库(实际上可以算作是18年年初才开始接触),现在不得不学习这戏开源库了。

于是乎,以这篇介绍 Retrofit 的使用开始慢慢苦修之路吧。


1. 简介

1.1 Retrofit 是啥?

Retrofit 是大名鼎鼎的 Square 公司开源的一个 网络加载框架,它的底层封装了 OkHttp 3,准确的说,网络请求的工作本质是 OkHttp 完成的,而 Retrofit 仅仅负责网络请求接口的封装。

Retrofit 的一大特点就是大量的注解使用,不过这也是我暂时比较疑惑的一点?为什么使用注解

至于 Retrofit 相较于 OkHttp 3 的优势,我现在了解的并不很深,仅仅知道是由于 Retrofit + RxJava 的便利使得众多开发者选择使用 Retrofit。

上述可能有误,但暂时理解就是这样的。挖下的坑自然等到理解加深后再来填了。

1.2 Retrofit 的好处?

初步理解的优点:

  • 支持 同步&异步
  • 提供对 RxJava 的支持
  • 使用起来比较简单,通过注解即可配置网络请求参数

网传的一些比较迷惑的优点:

  • 性能好、处理快(需要分析源码)
  • 解耦彻底(据网上的文章分析,Retrofit 为了实现高度解耦,采用了大量的设计模式,同样需要分析源码)

2. 使用介绍

2.1 注解

在介绍如何使用之前,先来学习一下前置技能:Retrofit 中的注解。

Retrofit 中的注解可以分为三个类型:网络请求方法、标志以及网络请求参数。

2.1.1 网络请求方法

图示如下:

序号 注解代码 说明
1 @GET GET 请求
2 @POST POST 请求
3 @PUT PUT 请求
4 @DELETE DELETE 请求
5 @PATCH PATCH 请求
6 @HEAD HEAD 请求
7 @OPTIONS OPTIONS 请求
8 @HTTP 供自定义扩展

说明:

  • 对于序号 1 ~ 7 :

    • 需要接收一个字符串表示 path,与后面的 baseUrl 组成完整的 url
    • 接收的 path 字符串可以使用 “变量”,如 {id},结合 @Path("id") 注解为 {id}提供值

      public interface Api{
             
          //注意此处 Call 的泛型是 ResponseBody,表示将直接返回服务器响应的 ResponseBody,即未作任何处理
          @GET("info/{id}")
          Call<ResponseBody> getInfo<@Path("id") int id>
      }
    • 当然也可以不指定 path,此时通过 @Url 注解指定 url

      public interface Api{
             
          @GET
          Call<ResponseBody> getInfo<@Url String url>
      }
  • 对于序号 8:

    • 可用于替换 以上 7 个,以及其扩展;
    • 有 3 个属性 method、path、hasBody
       interface Api {
           /**
           * method 请求方法,不区分大小写
           * path 路径,
           * hasBody 是否有请求体
           */ 
          @HTTP(method = "DELETE", path = "remove/", hasBody = true)
          Call<ResponseBody> deleteObject(@Body RequestBody object);
       }

2.1.2 标志

图示图下:

注解代码 说明
@FormUrlEncoded 表示请求主体将使用表单
@Multipart 表示请求体是多部分的
@Streaming 在返回响应的方法中处理 Response(没有该注释,则会将body()转换为 byte[],并全部载入到内存,之后从内存中读取数据)

说明:

  • FormUrlEncoded
    • 需要添加:Content-Type:application/x-www-form-urlencoded
  • Multipart
    • 需要添加:Content-Type: multipart/form-data
  • Streaming
    • 数据量大时,需要使用该注解,以免将数据全部载入内存造成 OOM

2.1.3 网络请求参数

图示如下:

注解代码 说明
@Body 直接指定 PUT/POST 的请求体,但并非作为请求参数或者表单的请求体
@Field 表单字段
@FieldMap 以键值对方式设置表单字段
@Header 添加请求头(不固定的请求头)
@HeaderMap 以 Map 形式添加请求头
@Headers 添加包含值的请求头(固定的请求头)
@Part 表示一个多部分请求的单个部分(多用于文件上传)
@PartMap 表示一个多部分请求的 name 和 value 字段(多用于文件上传)
@Path 替换 URL 中被 {} 包裹起来的字段
@Query 向 url 追加参数
@QueryMap 向 url 追加键值对参数
@QueryName 为没有 value 的 name 字段传值
@Url 使用全路径复写 baseUrl,用于非统一 baseUrl 的场景

上面这些注解,其实我也了解的不是很多,示例代码可以打开对应链接,查看官方示例。

说明:

  • Body

    //默认情况下
    @PUT/@POST("user/info")
    Call<ResponseBody> createUser(@Body User user);
    
    //为 Retorfit 添加转换器,此时可以将 ResponseBody 转换为指定类
    @PUT/@POST("user/info")
    Call<User> createUser(@Body User user);
  • Field & FieldMap

    二者体现在请求体(表单),即适用于POST方式(注意和 Query 等的区别)

    • Field

      @FormUrlEncoded
      @POST("login")
      Call<ResponseBody> userLogin(@Field("name") String name,@Field(
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值