androidretrofit(androidretrofit详解)
本篇文章给大家谈谈androidretrofit,以及androidretrofit详解对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...
- 2、Android Retrofit详解
- 3、Android上使用retrofit+okhttp时token失效的处理方案
- 4、Android Retrofit2基础使用
- 5、Android retrofit 注解@QueryMap和@Body的区别
- 6、Android 关于 Retrofit 回调的正确处理方式
【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...
对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了。
下面分为GET、POST、DELETE还有PUT的请求,说明@Path、@Query、@QueryMap、@Body、档猛@Field的用法。
{资讯id}
或
类型1
{资讯id}/{类型}
{资讯id}
或
;type= 类型1
{资讯id}type={类型}
;type= 类型穗蠢数1...
{资讯id}type={类型}...
也可以
{newsId}
{newsId}?access_token={access_token}
{newsId}?access_token={access_token}
{commentId}
{commentId}?access_token={access_token}
CommentBody :需要提交的内容,与 Post 中的 Body 相同
{accountId}
@Path:所有在网址中的参数(URL的问号前面),如:
{accountId}
@Query:猜首URL问号后面的参数,如:
{access_token}
@QueryMap:相当于多个@Query
@Field:用于POST请求,提交单个数据
@Body:相当于多个@Field,以对象的形式提交
Tips
[img]Android Retrofit详解
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网大知络祥橘请求接口的封装
1.添加Retrofit库的依赖:
后面三个是可选的,分别是数据解析器和gson,以及rxjava支持的依赖
2.创建 用于描述网络请求 的接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
3.创建Retrofit实例
4.发送请求
请求分为同步请求和异步请求
response.body()就是Reception对象,网络请求的完整 Url =在创建Retrofit实例时通过滚宴消.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )
整合的规则如下:
上面我们用了@GET注解来发送Get请求,Retrofit还提供了很多其他的注解类型
1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式
2.@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展
具体使用:通过属性method、path、hasBody进行设置
1.@FormUrlEncoded
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
2.@Multipart
表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。
1.@Header @Headers
添加请求头 添加不固定的请求头
2.@Body
以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:
3.@Field @FieldMap
发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用
4.@Part @PartMap
发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用
5.@Query和@QueryMap
用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
如:url = ,其中,Query = cate
配置时只需要在接口方法中增加一个参数即可:
6.@Path
URL地址的缺省值
7.@Url
直接传入一个请求的 URL变量 用于URL设置
Android上使用retrofit+okhttp时token失效的处理方案
提前声明,以下提到的方案并没有去验证过可行性,只是记录一下,未来需要用到的时候,在仔细验证一下。
一般情况下,各个公司的移动端关于登录令牌(token)的设判激定都各不相同。
可先参考这个链接:
了解一下,本文大概想说什么。
有些公司服务端是按照oauth设计,比较标准规范,但是有些公司有自己的特定业务,未完全按照oauth来设计。基于本公司的业务逻辑,考虑了一下登录的逻辑以及token的设计。
思路如下:
token即验证令牌,每次请求都带上,refreshToken用来刷新token的,每次请求可以不带上,但是要放在移动端保存。
1.通过username,password获取token和refreshToken
2.token的有效期为2小时,refreshToken的有效期为15天
3.如果服务器端判断token过期,而refreshToken未过期,就返回错误码给客户端,则客户端通过一个特定的接口传入refreshToken参数获取新的token和refreshToken
4.如果连续15天未使用app或掘岩袜者用户修改了密码,则表示refreshToken过期了,则跳到登录界面,重新登录获取token和refreshToken
基于上面的思路,如果服务端走rest风格,移动端(Android)采用retrofit(v2.0+)+okhttp(v2.7.0+)网络请求框架。那么当token过期了,Android端应该如何处理呢?
通过okhttp提供的Authenticator接口,相关资料 点击这里 ,但是查看okhttp的源码会发现,只有返回HTTP的状态码为401时,才会使用Authenticator接口,如果服务端设计规范,枣毕可以尝试如下方法。
实现Authenticator接口
然后给添加给OkHttpClient
第一种方案就这样了。
但是,万事不会尽如人意,如果服务端在token过期的时候,不给返回401的HTTP状态码,而是返回如下类型的数据,叫你根据code判断。
这里要清楚HTTP状态码是指200,404,401这些,而上面的数据中的code是自定义的。如果在token过期时,服务端返回的是如上类型的数据,那么第一种方案就行不通。
通过okhttp的拦截器,okhttp 2.2.0 以后提供了拦截器的功能,相关介绍 点击这里
然后给okhttp设置拦截器
第二种方案的思路是通过拦截返回的数据,判断token是否过期,如果过期则进行一次刷新token的操作。
上面2种方案都没有进行实际验证过,希望以后有机会能验证。
完。。。
Android Retrofit2基础使用
我是个肤浅的人,这里不讲原理,我也不会,这里只有Retrofit2的常规使用
添加依赖没拆
Url示例枯链枣:
Url示例唤差: ;id=2id=3address_id=1
Android retrofit 注解@QueryMap和@Body的区别
如果你的项目是采用POST请求方式,不管是使用实体类还是使用HashMap最好采用@Body注解。虽然你使用QueryMap 可能也不会有什么问题(PS:这种共用的情况只适用于POST请求,GET请求不能使用@Body注解和培轿,否则会报错唤肆)。
使用retrofit这样框架快一年了,以前使用它传递参数时都是用@QueryMap注解传递,虽然知道这样不是很好,但是当时换框架的时候看到工作量太大就没有换成实体类形式了,之前的使用方式如下图:
2.由于最近中丛在研究java后台,搭建了一个SSM框架想测试一下;因为之前以为HashMap只能采用这种方式传递,在今天的测试中发现并不是,其实使用HashMap同样可以采用@Body注解,而且@QueryMap跟@Body的区别非常大,先看按之前的方式使用@QueryMa
3.上面是android的代码,使用了RxJava。在来看java后台的:
4.使用HttpServletRequest来接收是没有问题的,但是如果后台使用@RequestBody来接收参数就没法接收到了,而且连请求都没接收到:
5.下面我们来看一下,android Studio打印的日志,发现后台返回了400,并且发现参数拼接到连接后面了,这不是GET的传递参数的方式吗?但是我明明是POST注解请求:
6.我点击注解看了下源码,看到下面的注释,第一句的大意就是说:会把key和value拼接到url后面,所以才会出现刚刚日志中那种情况,而且看注释都是在讲GET请求下的使用,并没有POST的使用介绍,所以我感觉这个注解是主要为GET请求准备的:
7.在来看@Body,先看源码吧 ,注释的大体意思是:使用这个注解可以把参数放到请求体中,适用于 POST/PUT请求:
8.然后再看使用方式,和@QueryMap 一样的,而且它可以使用实体类,QueryMap 是不能注解实体类的:
9.在看打印的日志:
10.从日志看出来,这才是POST请求参数参数的方式。
总结一下:@QueryMap注解会把参数拼接到url后面,所以它适用于GET请求;@Body会把参数放到请求体中,所以适用于POST请求。
Android 关于 Retrofit 回调的正确处理方式
对于 Activity,发起网络请求后得到一个 null ,到底应不应该刷新列拿慧表?
或者说,应该如何处理 Retrofit 的回调才显得合理并且优雅呢?
这里进行了简单封装,参见 SimpleCallback ,只答敏逗需要一句话即可发起请求清卖并将结果通过 LiveData 传递出去。
activity_retrofit_callback.xml
RetrofitCallbackActivity.kt
关于androidretrofit和androidretrofit详解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。