Retrofit 2.1 笔(详细)

Android 网路请求框架

一、RetrofitService 详细方法

1.retrofit注解
  • 方法注解:@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
  • 标记注解:@FormUrlEncoded、@Multipart、@Streaming。
  • 参数注解:@Query,@QueryMap、@Body、@Field、@FieldMap、@Part、@PartMap。
  • 其他注解:@Path、@Header、@Headers、@Url。
2.方法的编写
  • @Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释

      @GET("group/{id}/users")
      Call<List<ResponseBody>> groupList(@Path("id") int groupId);
    

    @GET("group/{id}/users") id为占位符
    @Path URL占位符
    请求地址等同于 http://baseurl/group/groupId/users

  • @Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode

      @GET("group/users")  
      Call<ResponseBody> groupListT(@Query("id") int groupId);
    

    地址等同于:http://baseurl/group/users?id=groupId

      @GET("group/users")
      Call<ResponseBody> getNews(@QueryMap(encoded = true) Map<String, String> options);
    

    @Query 查询参数
    @QueryMap 查询参数 可以约定是否需要encode

  • @Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释

      @GET("group/{id}/users")
      Call<ResponseBody> groupList(@Path("id") int groupId);
    

    @GET("group/{id}/users") id为占位符
    @Path URL占位符
    请求地址等同于 http://baseurl/group/groupId/users

  • @Body:POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,这个转化方式是GsonConverterFactory定义的。

      @POST("add")
      Call<ResponseBody> addUser(@Body ResBOperatorBean user);
    

    @Body POST请求体

  • @Field,@FieldMap:Post方式传递简单的键值对,需要添加@FormUrlEncoded表示表单提交。Content-Type:application/x-www-form-urlencoded

      @FormUrlEncoded
      @POST("user/edit")
      Call<ResponseBody> updateUser(@Field("fn") String first, @Field("ln") String last);
    

    @FormUrlEncoded 表单提交
    @Field Post方式传递简单的键值对
    @FieldMap 键值对集合

  • @Part,@PartMap:用于POST文件上传,其中@Part MultipartBody.Part代表文件,@Part(“key”) RequestBody代表参数
    。需要添加@Multipart表示支持文件上传的表单,Content-Type: multipart/form-data

      @Multipart
      @POST("upload")
      Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);
    

    @Multipart 支持文件上传的表单
    @Part 用于POST文件上传
    @PartMap

      /** 上传参数建立
          File file = new File("");
          RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
          MultipartBody.Part body = MultipartBody.Part.createFormData("picture", file.getName(), requestFile);
    
          String descriptionString = "hello, this is description speaking";
          RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
       */
    
  • @Header:header处理,不能被互相覆盖,用于修饰参数。动态设置Header值

      @GET("user")
      Call<ResponseBody> getUser(@Header("Authorization") String authorization);
      // 等同于静态设置Header值
      @Headers("Authorization: authorization")//这里authorization就是上面方法里传进来变量的值
      @GET("widget/list")
      Call<ResponseBody> getUser();
    

    @Header 修饰header

  • @Headers 用于修饰方法,用于设置多个Header值

      @Headers({
          "Accept: application/vnd.github.v3.full+json",
          "User-Agent: Retrofit-Sample-App"
      })
      @GET("users/{username}")
      Call<ResponseBody> getUserT(@Path("username") String username);
    

    @Headers 修饰header

  • @HTTP:可以替代其他方法的任意一种

      @HTTP(method = "get", path = "users/{user}", hasBody = false)
      Call<ResponseBody> getFirstBlog(@Path("user") String user);
    

    method 请求方法,不区分大小写
    path 请求路径
    hasBody 是否有请求体

  • @Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。

      @GET
      Call<ResponseBody> v3(@Url String url);
    

    @GET GET请求
    @Url 使用全路径复写baseUrl

  • @Streaming:用于下载大文件

      @Streaming
      @GET
      Call<ResponseBody> downloadAsync(@Url String fileUrl);
    

    @Streaming 用于下载大文件

      /**
       接收后写法
       ResponseBody body = response.body();
       long fileSize = body.contentLength();
       InputStream inputStream = body.byteStream();
       */
    

二、自定义请求返回基类

1.用途说明

可以统一返回参数(俗称:数据壳)。如:errorCode、message、data...
可根据自身要求进行调整。

2.代码
package com.demon.retrofit20.http;

/**
 * @author Demon
 * @version V1.0
 * @Description: 请求返回基类
 * @date 2016年10月18日16:17:35
 */
public class BaseCallBean<T> {

    public boolean success;
    public String code;
    public T data;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

三、自定义CallBack

1.用途说明

用作请求接收的统一处理。如:成功时执行的相应操作、失败时的统一处理、异常的统一处理...
可根据自身要求进行调整。

2.代码
package com.demon.retrofit20.http;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * @author Demon
 * @version V1.0
 * @Description: 自定义CallBack
 * @date 2016年10月18日16:19:25
 */
public abstract class CusCallback<T extends BaseCallBean> implements Callback<T> {

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        // 请求接收成功的统一处理...
        /*
        if (response.body().code.equals("0")) {
            onSuccess(response);
        } else {
            onFailure(response.body().code);
        }
        */
        onSuccess(response);
    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        // 请求接收失败的统一处理...
        /*
        if (t instanceof SocketTimeoutException) {
            // 网络异常
            onNetError();
        } else if (t instanceof ConnectException) {
            // 网络异常
            onNetError();
        } else if (t instanceof RuntimeException) {
            // 系统异常
            onSysError();
        }
        */
        onFailure(t.getMessage());
    }

    /**
     * 请求成功
     * @param response  Response
     */
    public abstract void onSuccess(Response<T> response);

    /**
     * 请求失败
     * @param message   错误消息
     */
    public abstract void onFailure(String message);
}

四、出坑解决方案

1.乱码解决方式
String name =  URLEncoder.encode("111","UTF-8");

五、未探索内容

1.自定义Converter
2.缓存策略
3.与RxJava 结合

2016/10/19 1:04:11
代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容