关闭

Retrofit2.0中注解使用套路

标签: Retrofit注解
9402人阅读 评论(1) 收藏 举报
分类:

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

说说Retrofit中的注解

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

下边列举各种应用场景。

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

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);
}

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

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

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

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);
}

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

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

三、半静态的url地址请求

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);
}

四、动态的url地址请求

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

public interface GitHubService {
  @GET
  Call<List<Repo>> listRepos(@Url String user);
}

五、总结小细节

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

Android Retrofit 2.0使用

转:http://wuxiaolong.me/2016/01/15/retrofit/ 添加依赖 app/build.gradle compile 'com.squareup.retrofit2:retrofit:2.1.0'
  • u014695188
  • u014695188
  • 2016-10-28 15:36
  • 1676

java.lang.IllegalArgumentException: FormUrlEncoded can only be specified on HTTP methods with requ

java.lang.IllegalArgumentException: FormUrlEncoded can only be specified on HTTP methods with request body
  • yuerliang
  • yuerliang
  • 2017-09-18 17:13
  • 294

java.lang.IllegalArgumentException: Illegal character in query at index

今天进行app测试的时候,遇到了这个问题。ca,之前都没有注意,就是按照提供的接口堆起来,然后请求数据结果!今天测试的时候使用汉字+字母进行拼接作为信息发送的时候,突然报错: java.lang.IllegalArgumentException: Illegal character in query...
  • u012827205
  • u012827205
  • 2014-12-10 14:33
  • 5954

Retrofit2 完全解析 探索与okhttp之间的关系

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51304204; 本文出自:【张鸿洋的博客】 一、概述 之前写了个okhttputils的工具类,然后有很多同学询问这个工具类和retrofit什么区别,于是上了...
  • lmj623565791
  • lmj623565791
  • 2016-05-04 10:02
  • 111050

Retrofit Url 配置

正文开始之前,先说个折腾了2天才搞清楚的事情。如果你用post请求进行提交数据(比如用户注册、登陆等表单类请求),参数类型一定要用准确,是Field,如果选择了Query,而调试过程没有发现这个问题,相信我你会发疯的。@FormUrlEncoded @POST("/some/endpoin...
  • jdsjlzx
  • jdsjlzx
  • 2016-06-05 11:14
  • 15329

Retrofit使用总结

Retrofit-一个对Android和Java类型安全的HTTP客户端引言Retrofit把你的HTTP API变成了Java接口public interface GitHubService { @GET("users/{user}/repos") Call<Li...
  • u010321471
  • u010321471
  • 2017-03-14 21:10
  • 1442

@Field parameters can only be used with form encoding

今天在学习Retrofit的时候,当post请求时public interface NewsDataService { @POST("news/list") Call<NewsData> getNewsData(@Field("key&quo...
  • u014005316
  • u014005316
  • 2016-12-28 17:43
  • 6332

retrofit 错误解析

example.luokx.loadmore_2016_03_02_09_56.MainActivity}: java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (par...
  • qq906786621
  • qq906786621
  • 2016-03-02 10:45
  • 6277

@Field parameters can only be used with form encoding

今天在学习Retrofit的时候,当post请求时public interface NewsDataService { @POST("news/list") Call<NewsData> getNewsData(@Field("key&quo...
  • tiankongcheng6
  • tiankongcheng6
  • 2017-06-26 18:07
  • 313

java.lang.IllegalArgumentException介绍

相信这个异常大家都很常见。 我现在遇到一个需要配置tomcat  server.xml来修正的找不到的问题: 如下: java.lang.IllegalArgumentException: Document base C:\Source\AirChina\AirChina_Por...
  • zhiweianran
  • zhiweianran
  • 2012-08-28 17:18
  • 93155
    个人资料
    • 访问:288682次
    • 积分:3978
    • 等级:
    • 排名:第9390名
    • 原创:329篇
    • 转载:17篇
    • 译文:10篇
    • 评论:35条
    博客专栏
    最新评论