Retrofit的简单介绍

一、什么是Retrofit?
Retrofit,官方对他的描述是“一个类型安全的Android和java网络请求的客户端”,其实就是一个封装好的网络请求库。首先,在网上找一个API接口用于测试:https://so.iqiyi.com/so/q_吐槽大会?source=input&sr=1456190233864 这是一个在爱奇艺搜索一个词详细信息的请求接口。

我们假设他返回

{"data":{"poster":"http://sdakkaa.jpg"},"code":200,"message":"123"}

接下来,让我们看看如何用Retrofit将上面的数据请求下来。当然了,为了在Android studio中添加Retrofit库,我们还需要添加一下依赖:implementation 'com.squareup.retrofit2:retrofit:2.1.0'

OK,添加完该库,我们再来看看到底如何使用。

首先,我们创建一个实体类和一个通用类,用于存放网络数据请求后返回的数据。这里顺带说一句,有的人创建一个实体类时可能会根据浏览器中返回的数据去一行一行的敲,这样难道你们不嫌麻烦吗?在这里教大家一个简单快捷的方法,瞬间生成一个实体类。有的人会说了“哎呀,我用过”。没错,就是GsonFormat。它的使用很简单,首先我们要在Android studio中下载这个插件,点击左上角的File,然后点击Settings,在窗口中选择Plugins,然后点击下面的Browse repositories...(上张图给你们)

然后在新打开的窗口里面搜索GsonFormat,再点击Install plugin就可以下载安装啦,安装完成后需要重启studio,就可以用了。

它的用法很简单,就比如我们建的BaseResponse实体类,在类里面按Alt+insert,会弹出一个窗口,选择GsonFormat,然后在弹出的编辑框里面拷入在浏览器中请求下来的数据,然后一直点击OK它就会自动生成字段,以及set和get方法,一会我们用Retrofit请求下来的数据都会保存在这个实体类中,还是挺方便的。最后,再添加一个toString()方法,为了后面显示方便。

好了,回到正题,实体类已经建好了,我们来看看这个Retrofit如何进行网络请求,其实代码也很简单,首先 我们需要定义一个接口,取名为:RetrofitDaoInter:

看到这儿,想必有人要问了,这是什么玩意儿,跟平时用的接口类很像,但又不一样啊。别着急,我来一一解释一下,和比的接口类一样,我们在其中定义了一个方法searchVideo,那么这个方法是干什么的呢?其实很简单,它就是拼接一个URL然后进行网络请求,这里我们拼接的URL是上文中提到的测试URL,以你的智商你一定看出来了,这个URL中的so/就是GET后的值,而“?”后面的q、source、sr等入参就是这个方法的入参。有的朋友要问了,https://so.iqiyi.com/ 这么大一串跑哪儿去了?其实我们在进行网络请求的时候,在URL中前一部分是相对不变的。什么意思呢?比如你打开爱奇艺网站,在爱奇艺中你打开不同的网页,虽然他的URL会不同,但是你会发现,每个URL前面都是以https://so.iqiyi.com/ 开头,我们把这个不变的部分,也叫做baseUrl提出来,放到另一个地方,下面我们会提到这个问题。这样我们一个完整的URL就拼接好了。在方法的开头我们可以看到有个GET的注释,说明这个请求是GET方法的,当然你也可以根据需要用POST、PUT、DELETE以及HEAD。他们的区别如下

GET  ----------  查找资源(查)
POST  --------  修改资源(改)
PUT  ----------  上传文件(曾)
DELETE  ----  删除文件(删)
HEAD --------- 只请求页面的首部
然后我们来看一下这个方法的返回值,它返回Call实体,一会我们要用它进行具体的网络请求,我们需要为它指定泛型为Video也就是我们数据的实体类。接下来,你会发现这个方法的入参和我们平时方法的入参还不大一样。在每个入参前还多了一个注解。比如第一个入参@Query("q") String name ,Query 表示把你传入的字段拼接起来,比如在测试URL中我们可以看到q=金瓶梅的入参,那么Query后面的值必须是q,要和URL中保持不变,然后我们定义了String类型的name,当调用这个方法时,用于传入字符串,比如可以传入“金瓶梅”。那么这个方法就会自动在q后面拼上这个字符串进行网络请求。以此类推,这个url需要几个入参你就在这个方法中定义几个入参,没个入参前面都要加上Query 注解。当饭Retrofit除了Query 这个注解外,还有几个其他的,比如:@QueryMap,@Path,@Body,@FormUrlEncoded/Field,@Header,@Headers。我们来看一下他们的区别

@Query(GET请求):

用于在URL后拼接上参数

相当于:

@QueryMap(GET请求):

当然如果参数比较多,就可以把它们都放在Map中

@Path(GET请求):

用于替换url中某个字段

像这种请求接口,在so和source之间有个不确定的q值需要传入,就可以这种方法。我们把待定的值字段用{}括起来,当然 {}里的名字不一定就是q,可以任取,但需和@Path后括号里的名字一样。如果在source后面还需要传入参数的话,就可以用Query拼接上

当我们调用这个方法时,假设我们q传入1,sr传入“2”,那么它拼接成的url就是so/1/source=input?sr=2,当然最后请求的话还会加上前面的baseUrl。

@Body(POST请求):

可以指定一个对象作为HTTP请求体

它会把我们传入的User实体类转换为用于传输的HTTP请求体,进行网络请求。

@Field(POST请求):

用于传送表单数据

注意开头必须多加上@FormUrlEncoded这句注释,不然会报错。表单自然是有多组键值对组成,这里的video就是键,而具体传入的video就是值

@Header/@Headers(POST请求):

用于添加请求头部

表示将头部Author属性设置为你传入的author;当然你还可以用@Headers表示,作用是一样的

当然你可以多个设置

好了,这样我们就把上面这个RetrofitDaoInter 接口类解释的差不多了。我觉得,Retrofit最主要的也就是这个接口类的定义了。好了,有了这个接口类,我们来看一下,到底如何使用这个我们定义的接口来进行网络请求。代码如下:

这里我们可以看到,先新建了一个Retrofit对象,然后给它设置一个我们前面说的baseUrl, https://so.iqiyi.com/因为接口返回的数据不是我们需要的实体类,我们需要调用addConverterFactory方法进行转换。由于返回的数据为json类型,所以在这个方法中传入Gson转换工厂GsonConverterFactory.create(new GsonBuilder().create()),这里我们需要在studio中添加Gson的依赖:implementation  'com.squareup.retrofit2:converter-gson:{retrofitversion}'


然后我们调用retrofit的create方法并传入上面我们定义的接口的文件名RetrofitDaoInter.class,就可以得到RetrofitDaoInter 的实体对象。有了这个对象,我们就可以调用里面之前定义好的请求方法了

它会返回一个Call实体类,然后就可以调用Call的enqueue方法进行异步请求,在enqueue方法中传入一个回调CallBack,重写里面的onResponse和
onFailure方法,也就是请求成功和失败的回调方法。当成功时,它会返回Response,里边封装了请求结果的所有信息,包括报头,返回码,还有主体等。比如调用它的body()方法就可获得CommonResponse<Video>对象,也就是我们需要的数据。

好了,到这里我们就基本了解了Retrofit的整个工作流程。

关于RxJava的讲解,将会在下一章给大家呈现,敬请期待!

猜你喜欢

转载自blog.csdn.net/elank0521/article/details/105140137