Retrofit学习笔记01
retrofit把你的HTTP API改造成java接口。
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit类实现了GithubService接口。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.build(); GitHubService service = retrofit.create(GitHubService.class);
这样就实现并创建了一个GithubService实例。
这个实例每次调用create方法都会创建一个同步或异步的远程网络服务。
Call<List<Repo>> repos = service.listRepos("octocat");
使用注解来描述这个HTTP请求:
支持URL参数与数组参数。
支持request body添加Object参数(比如JSON,protocol buffers)
支持Multipart requeset body与文件上传。
注意:这一部分还在2.0 AIPs 后不断拓展。
声明
接口方法的注释与参数表明了该请求应如何处理。
请求方式
每一个请求都必须有描述请求方式及请求地址的HTTP注释。
@GET("users/list")
你也可以在URL中添加参数。
@GET("users/list?sort=desc")
URL处理
请求可以通过在url中使用置换块实现动态更新参数。置换块是使用被{}包裹的含有字母、数字的字符串。相应的参数必须通过@Path注释 参数名与之前的字符串相同。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
数组参数也可以被这样添加。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
复杂的数组参数可以通过Map组合实现。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
REQUEST BODY
一个object对象可以通过 @Body 注释 来被指定为 request body。
@POST("users/new")
Call<User> createUser(@Body User user);
这个object将会被Retrofit实例指定的的转换器所转换。如果Retrofit实例没有添加转换器,就只能使用 RequestBody。
FORM ENCODED AND MULTIPART
方法也可声明发送 form-encoded 和 multipart data。
当在方法中出现@FormUrlEncoded时会发送form-encoded data。每一个键值对通过 @Field 注释来提供name与object的值。
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
Multipart 部分使用Retrofit的一个转换器或者通过实现RequestBody去实现他们自己的序列化。
HEADER MANIPULATION
你可以通过使用@Headers注释为一个方法设置统一的headers
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
注意headers都不会进行覆盖。相同名字的headers都会包含在请求中。
一个请求的Header 可以通过使用@Header注释来实现动态更新。必须为@Header注释提供对应的参数。如果参数值为null,这个header将会被忽略。反之,将会使用参数的toString方法的输出作为参数的值。
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
使用 OkHttp interceptor为每一个请求添加相同的headers。
同步与异步
每一个请求的实例都可以同步或异步执行。每一个实例都只能被执行一次,但是可以通过执行clone()方法创建一个新的可使用的实例。
在Android里,回调将会主线程中执行。在jvm,回调将在执行http请求的线程中被执行。
Retrofit 是一个通过你的API接口转变成可调用对象的类。默认的,retrofit将会给你一个稳健的默认实现但也允许你进行定制。
转换器
默认的,Retrofit只能反序列化HTTP bodies到OkHttp's ResponseBody类型中并且他只能接受其 RequestBody 类型通过 @Body。
添加转换器可以让它支持其他类型。有六种支持库。
- Gson:
com.squareup.retrofit2:converter-gson - Jackson:
com.squareup.retrofit2:converter-jackson - Moshi:
com.squareup.retrofit2:converter-moshi - Protobuf:
com.squareup.retrofit2:converter-protobuf - Wire:
com.squareup.retrofit2:converter-wire - Simple XML:
com.squareup.retrofit2:converter-simplexml - Scalars (primitives, boxed, and String):
com.squareup.retrofit2:converter-scalars
这里有一个使用 GsonConvertreFactory 类去生成一个使用Gson进行反序列化的GitHubService实现类的例子。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build(); GitHubService service = retrofit.create(GitHubService.class);
自定义转换器
如果你需要与一个Retrofit不支持且使用content-format的API通信(如 YAML,txt,自定义格式)或者你希望同一个不同的库来实现已存在的格式,又可以简单的创建你自己的转换器。创建一个继承与 Converter.Factory的类并在创建适配器是将其实例传入。
初步阅读完毕,我要开始进行实践了。
Retrofit学习笔记01的更多相关文章
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- SaToken学习笔记-01
SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...
- Redis:学习笔记-01
Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...
- PHP 学习笔记 01
例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...
- vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍
这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...
- xml基础学习笔记01
注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...
- Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
Ext.Net是一个对ExtJS进行封装了的.net控件库,可以在ASP.NET WebForm和MVC中使用.从今天开始记录我的学习笔记,这是第一篇,今天学习了如何在WebForm中使用Ext.Ne ...
- FPGA-VHDL课堂学习笔记*01
FPGA-VHDL课堂学习笔记 记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记. 代码语言:VHDL 编程软件:MAX+plus II FPGA硬件:FLE-843 03月05日 理论课 ...
随机推荐
- 封装获取dom元素
<script> //函数: 反复执行的代码块 //全局只有一个对象,防止全局变量污染 var itcast = { getElen : { tag : function(tag){ re ...
- MySQL主从同步报错排错结果及修复过程之:Slave_SQL_Running: No
起因调查: 收到大量邮件报警想必事出有因,就问同事到底发生了什么?同事登录从库查看,发现出现如下报错提示,表示与主库同步失败,一直卡在哪里,看他弄了两个多小时,问题越来越多,解决一个恢复平静了一两分钟 ...
- C++ TR1 Function Bind
在C++ 11出现以前,C++的事件一般是通过回调形试来实现,如 void (*func)(int,int,int),其实际上是一种函数指针,在C中调用时是直接写函数名在参数列表中,而在C++中,大部 ...
- C++用法的学习心得(要求包含示例,并反映出利用网络获取帮助的过程)
大一一年C++的学习生涯,让我感慨颇多!回想起,当初上课时的情形,一切是那么的清晰,仿佛就像是发生在昨天一样. 任何一门学科的学习都是有技巧的.对于c++,我学的并不好,刚开 ...
- Onedrive 明年初基础容量缩小到5G,执行这一步骤避免(保持30G)
Onedrive作为微软的云盘,相当实用,存储一些照片文档. 之前微软一直执行免费用户可以永久拥有30G空间(基础+开启功能获得). 但微软打算从明年开始减低这一优惠至5G. 不过最近微软有一些放松, ...
- js⑤
##返回在制定位置的的字符 var result = str.charAt(1); console.log(result); console.log(str[1]); ##返回在指定的位置的字符 ...
- [转]iOS7中UITextView contentsize改变时机
在iOS7以下版本中,对UITextView设置了text属性,则contentsize就会变化,从而可以根据contentsize的变化来改变UITextView高度来做出TextView高度随着输 ...
- JS总结 循环 退出循环 函数
while循环 while(条件){条件成立就执行的代码} *一般条件变量需要递增,否则会进入死循环(无限循环),浏览器会崩溃甚至电脑死机 例如,逐行输出1-100的数字 var i = 1; whi ...
- 没有为扩展名.htm注册的生成提供程序,没有为扩展名.html注册的生成提供程序
在web.config中添加下面这段 代码如下 <buildProviders> <add extension=".html" type="System ...
- iOS AVCaptureSession 小视频开发总结,支持设备旋转
iOS开发中当我们想要自定义相机拍照或摄像界面时,UIImagePickerController无法满足我们的需求,这时候我们可以使用AVFoundation.framework这个framework ...