Retrofit Android网络加载框架

Retrofit是一个基于OkHttp的网络加载框架,提供了解耦网络请求接口和实现的特性。其优点包括支持多种HttpClient、同步/异步请求、RxJava整合、可配置不同反序列化工具。Retrofit通过注解简化了接口定义,如@GET、@POST、@Query等,允许动态添加header和参数。使用时,需要添加依赖,创建Retrofit对象,定义接口,并通过Call或Observable发起请求。对于文件下载,Retrofit配合@Streaming可以处理大文件下载。
摘要由CSDN通过智能技术生成

 Retrofit Android网络加载框架


Retrofit是什么?

Retrofit其实我们可以理解为OkHttp的加强版,它也是一个网络加载框架。底层是使用OKHttp封装的。准确来说,网络请求的工作本质上是OkHttp完成,而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。
还想说一点题外话,Retrofit和OkHttp(我们公司用到的OKGO框架也是封装人家的OkHttp)都是square公司(前一篇我写的简书文章Dragger也是他们的,我擦,真是大佬!)

Retrofit的好处?

  • 超级解耦
    解耦?解什么耦?
    我们在请求接口数据的时候,API接口定义和API接口使用总是相互影响,什么传参、回调等,耦合在一块。有时候我们会考虑一下怎么封装我们的代码让这两个东西不那么耦合,这个就是Retrofit的解耦目标,也是它的最大的特点。
    Retrofit为了实现解耦,使用了特别多的设计模式,这里附上一片很好的文章,里面讲的就是实现原理:
    Retrofit分析-漂亮的解耦套路
  • 可以配置不同HttpClient来实现网络请求,如OkHttp、HttpClient...
  • 支持同步、异步和RxJava
  • 可以配置不同的反序列化工具来解析数据,如json、xml...
  • 请求速度快,使用非常方便灵活

Retrofit注解

  • 请求方法
注解代码 请求格式
@GET GET请求
@POST POST请求
@DELETE DELETE请求
@HEAD HEAD请求
@OPTIONS OPTIONS请求
@PATCH PATCH请求
  • 请求参数
注解代码 说明
@Headers 添加请求头
@Path 替换路径
@Query 替代参数值,通常是结合get请求的
@FormUrlEncoded 用表单数据提交
@Field 替换参数值,是结合post请求的

下面我们详细说说这些注解

我们先来看一段Retrofit请求的简单用法

  • 添加依赖
    由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖
    在build.grale添加如下依赖:
dependencies {
    // Okhttp库
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    // Retrofit库
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
}
  • 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
  • 创建接收服务器返回数据的类
public class News {
    // 根据返回数据的格式和数据解析方式(Json、XML等)定义
    ...
}
  • 创建用于描述网络请求的接口
public interface APi {
    // @GET注解的作用:采用Get方法发送网络请求
    // getNews(...) = 接收网络请求数据的方法
    // 其中返回类型为Call<News>,News是接收数据的类(即上面定义的News类)
    // 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody>
    @Headers("apikey:81bf9da930c7f9825a3c3383f1d8d766")
    @GET("word/word")
    Call<News> getNews(@Query("num") String num,@Query("page")String page);
}

这一块知识点很多,做好笔记了!

①Retrofit将Http请求抽象成Java接口,并在接口里面采用注解来配置网络请求参数。用动态代理将该接口的注解“翻译”成一个Http请求,最后再执行 Http请求
注意: 接口中的每个方法的参数都需要使用注解标注,否则会报错

②APi接口中的最后一个注释,Responsebody是Retrofit网络请求回来的原始数据类,没经过Gson转换什么的,如果你不想转换,比如我就想看看接口返回的json字符串,那就像注释中说的,把Call的泛型定义为ResponseBody:Call<ResponseBody>

③GET注解
说白了就是我们的GET请求方式。
这里涉及到Retrofit创建的一些东西,Retrofit在创建的时候,有一行代码:

baseUrl("http://apis.baidu.com/txapi/")

这个http://apis.baidu.com/txapi/是我们要访问的接口的BaseUrl,而我们现在用GET注解的字符串 "word/word"会追加到BaseUrl中变为:http://apis.baidu.com/txapi/world/world
在我们日常开发中,BaseUrl具体是啥由后端接口童鞋给出,之后接口童鞋们会出各种各种的后缀(比如上面的 "word/word")组成各种各行的接口用来供移动端数据调用,实现各种各样的功能

④@Query
简单点来说呢

@Query("num")String num, @Query("page")String page;

就是键值对,Retrofit会把这两个字段一块拼接到接口中,追加到http://apis.baidu.com/txapi/world/world后面,变为http://apis.baidu.com/txapi/world/world?num=10&page=1,这样,这个带着响应头的接口就是我们最终请求网络的完整接口。
这里补充一点哈,GET请求方式,如果携带的参数不是以

?num=10&page=1

拼接到接口中(就是不带?分隔符),那就不用Query注解了,而是使用Path注解&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值