Retrofit2学习笔记-2

继续上一篇笔记,我们继续记录一下Retrofit2对象创建之后,我们就可以创建网络请求对应的interface了。
使用注解定义网络请求API

public interface WeatherService {
    @GET("weather_mini")
    Call<WeatherBean> getWeatherInfo(@Query("city") String city);
}

上面的代码使用了@GET注解定义了一个GET请求。那么Retrofit2还支持哪些注解呢?

Retrfit2中的注解

上面的表格就是retrofit2所支持的部分注解,我们一一了解一下。
首先是@GET注解,这个注解是用来声明一个GET请求的。
@GET("users/list")
这是一个GET注解的简单使用方法,注解的参数"users/list"会和声明Retrofit2对象时设置的根URL拼接,我们还可以添加参数。
@GET("users/list?sort=desc")
当然也可以用变量

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

这其实这也引入了另一个注解@Path,它会替换URL中的用花括号包起来的变量。使用方法如上面代码,URL中的‘id’会被替换成groupList方法的入参groupId。
当然要动态加参数也是可以的。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

@Path注解的使用方法同上,我们关注一下@Query注解,上面代码生成的url会是这样的group/groupId对应的值/users?sort=sort对应的值这样的url。这样我们就可以在URL中添加参数了,如果我们要添加多个参数的话还可以使用@QueryMap这个注解。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

可以看到@QueryMap这个注解对应的是一个Map数据类型,它的的泛型是Map<String,String>所以它的key和value都是String类型的,它的key和Value在URL中的对应关系如下group/groupId/users?key=value所以理解起来也比较容易。
好我们再来看一下Retrofit2中的POST请求对应的注解@POST

@POST("users/new")
Call<User> createUser(@Body User user);

上面的代码中使用了两个注解,我们先看@POST注解,它的参数和@GET注解类似都代表拼接的URL,再看@Body注解,上面的代码中使用的是一个User实体bean,这个时候就需要使用我们上一个笔记中的转换器Converter设置对应的转换器就可以把实体bean转换成Converter对应的数据类型,比如这里我们使用一个Gson的转换器,在这里我们使用@Body注解注解的时候user对象就会被转换成json字符串被放入到post请求中,如果没有设置任务Converter这个地方只能是RequestBody类型的参数。具体RequestBody类型的使用方法我会在以后的笔记中介绍。
HTTP请求还可以有FROM表单的提交,要使用FROM表单提交我们可以这样做。

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@FormUrlEncoded注解表示POST请求携带了FROM表单,@Field注解对应FROM表单中的每个属性值,比如@Field("first_name") String first代表FROM表单中的first_name属性的值为first。当然我们也可以批量添加属性值,对应的注解为@FieldMap,它的用法和@QueryMap一样大家可以去上面参考一下。
还有一个注解@Url,这个注解是在@GET@POST没有设置URL时必须使用的。

@GET //当有URL注解时,这里的URL就省略了
Call<ResponseBody> query(@Url String url, @Query("showAll") boolean showAll);

@Url注解支持的类型有okhttp3.HttpUrl,String, java.net.URI, android.net.Uri几种。
再介绍一个注解@HTTP,它的用法如下:

public interface BlogService {
     /**
       * method 表示请的方法,不区分大小写
       * path表示路径
       * hasBody表示是否有请求体
     */
      @HTTP(method = "get", path = "blog/{id}", hasBody = false)
      Call<ResponseBody> getFirstBlog(@Path("id") int id);
}

这个@HTTP注解可以包含很多注解的功能,GET,POST,PATH,HEAD等等。
如果我们要在HTTP请求的header中加入参数就需要@Header@Headers两个注解。

public interface BlogService {
    @GET("/headers?showAll=true")
    @Headers({"CustomHeader1: customHeaderValue1", "CustomHeader2: customHeaderValue2"})
    Call<ResponseBody> testHeader(@Header("CustomHeader3") String customHeaderValue3);
}

相信大家看到代码也就知道了这两个注解的使用方法了。
还有一种情况是文件上传,先看代码。

/**
 * @Part后面支持三种类型,RequestBody、okhttp3.MultipartBody.Part、任意类型
 * 除 okhttp3.MultipartBody.Part以外,其它类型都必须带上表单字段(okhttp3.MultipartBody.Part中已经包含了表单字段的信息),
 */
@POST("/form")
@Multipart
Call<ResponseBody> fileUpload1(@Part("name") RequestBody name,@Part MultipartBody.Part file);

/**
 * PartMap 注解支持一个Map作为参数,支持RequestBody类型,
 * 如果有其它的类型,会被retrofit2.Converter转换,如使用com.google.gson.Gson的retrofit2.converter.gson.GsonRequestBodyConverter
 * 所以MultipartBody.Part就不适用了,所以文件只能用MultipartBody.Part
 */
@POST("/form")
@Multipart
Call<ResponseBody> fileUpload2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);

上面代码有三个新注解@Multipart@Part以及@PartMap@Multipart注解表示请求体是一个支持文件上传的FROM表单,@Part代表表单的属性,@Part后面支持三种类型,RequestBody、okhttp3.MultipartBody.Part、任意类型。除 okhttp3.MultipartBody.Part以外,其它类型都必须带上表单字段,okhttp3.MultipartBody.Part对应的是文件流。@PartMap注解和上面的类似,是一个集合注解。要是使用文件上传需要使用如下方法。

MediaType textType = MediaType.parse("text/plain");
RequestBody name = RequestBody.create(textType, "name");
RequestBody file = RequestBody.create(MediaType.parse("application/octet-stream"), "这里是模拟文件的内容");

首先我们要定义一下part的类型,MediaType textType = MediaType.parse("text/plain");这个声明的是文本类型,而RequestBody file = RequestBody.create(MediaType.parse("application/octet-stream"), "这里是模拟文件的内容");这里声明的就是二进制类型,我们来看一下RequestBody类的方法。

RequestBody

重点看create方法的几个重载,根据参数的不同我们可以传入文本、byte数组、文件对象,这基本满足了我们的需要。

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

推荐阅读更多精彩内容