注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

Retrofit2.0中注解使用套路  

2018-01-04 11:12:10|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

之前有讲过Retrofit2.0的简单使用和解析。最近在做Retrofit替换之前使用的AsyncHttpClient,在替换的过程中遇到一些之前忽视的小细节。自己感觉知道这几点在开发中灵活使用Retrofit非常有好处。

说说Retrofit中的注解

@Query,@QueryMap,@Field,@FieldMap,@FormUrlEncoded,@Path,@Url 
这七种注解应该是最常用的了。

下边列举各种应用场景。

一、get方式请求静态url地址

de  >Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
public interface GitHubService {
    //无参数
    @GET("users/stven0king/repos")
    Call<List<Repo>> listRepos();
    //少数参数
    @GET("users/stven0king/repos")
    Call<List<Repo>> listRepos(@Query("time") long time);
    //参数较多
    @GET("users/stven0king/repos")
    Call<List<Repo>> listRepos(@QueryMap Map<String, String> params);
}de>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

@Query和@QueryMap也可以结合在一起使用。

要是对应的url在服务端支持get/post两种类型的请求的话,那么上面的@GET变为@POST也可以执行,只不过post请求时所带的参数也会像get方式一样已?key=value&key1=vaule2…的形式拼接在url的后边。

二、post方式请求静态url地址

de  >Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build()
public interface GitHubService {
    //无参数
    @POST("users/stven0king/repos")
    Call<List<Repo>> listRepos();
    //少数参数
    @FormUrlEncoded
    @POST("users/stven0king/repos")
    Call<List<Repo>> listRepos(@Field("time") long time);
    //参数较多
    @FormUrlEncoded
    @POST("users/stven0king/repos")
    Call<List<Repo>> listRepos(@FieldMap Map<String, String> params);
}de>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

@Field和@FieldMap可以结合在一起使用。

另外是不是发现了比起@GET多了一个@FromUrlEncoded的注解。如果去掉@FromUrlEncoded在post请求中使用@Field和@FieldMap,那么程序会抛出de >java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1)de>的错误异常。如果将@FromUrlEncoded添加在@GET上面呢,同样的也会抛出de >java.lang.IllegalArgumentException:FormUrlEncoded can only be specified on HTTP methods with request body (e.g., @POST).de>的错误异常。

三、半静态的url地址请求

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

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}de>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

四、动态的url地址请求

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

public interface GitHubService {
  @GET
  Call<List<Repo>> listRepos(@Url String user);
}de>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

五、总结小细节

  • 当@GET或@POST注解的url为全路径时(可能和baseUrl不是一个域),会直接使用注解的url的域。
  • 如果请求为post实现,那么最好传递参数时使用@Field、@FieldMap和@FormUrlEncoded。因为@Query和或QueryMap都是将参数拼接在url后面的,而@Field或@FieldMap传递的参数时放在请求体的。
  • 使用@Path时,path对应的路径不能包含”/”,否则会将其转化为%2F。在遇到想动态的拼接多节url时,还是使用@Url吧。
http://blog.csdn.net/stven_king/article/details/52372172
  评论这张
 
阅读(10)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018